java - 在Java中使用继承时如何使方法通用?

标签 java generics inheritance

我有类 Employee 和 3 个扩展 Employee 类的类。 我还有 EmployeeService 接口(interface),我希望只有一个 save 方法来处理保存每种类型的 Employee。所以我认为可以使用泛型来解决它。 这是我在 EmployeeService 接口(interface)中尝试的:

public interface EmployeeService {
<SubRequestT extends  Employee>EmployeeResponse save(SubRequestT requestT);
}

以及提供实现的类:

@Service
public class EmployeeServiceImpl implements EmployeeService {

// So here in argument i want to have to put any kind of Employee, for example:
@Override
public EmployeeResponse save(OfficeEmployee requestT) {
// Logic for saving employee
    return null;
}
}

但是当我从 Employee 类型更改为任何其他类型时,例如从 Employee 扩展的 OfficeEmployee ,编译器给了我一个错误。解决这个问题的最佳方法是什么?

最佳答案

对于“方法泛型”,我(我和编译器)也很挣扎,但是通过“类型泛型”,我们可以做到这一点!

假设:

class Foo {/*...*/}

class Bar extends Foo {}

class Baz extends Foo {}

// extending your question to two generic parameters:
class FooResult {}

class BarResult extends FooResult {}

class BazResult extends FooResult {}

当我们定义接口(interface)时:

interface FooI<I extends Foo, R extends FooResult> { //or with even more (fixed size) "generic parameters"
  R save(I request);
}

我们可以像这样覆盖它:

class BarImpl implements FooI<Bar, BarResult> {
  @Override
  public BarResult save(Bar bar) {
    // ...
    return ...;
  }
}

class BazImpl implements FooI<Baz, BazResult> {
  @Override
  public BazResult save(Baz baz) {
    // ...
    return ...;
  }
}

关于java - 在Java中使用继承时如何使方法通用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70404813/

相关文章:

java - 如何使继承可序列化类的类永远不可序列化?

c# - 多态与继承

c# - 接口(interface)、继承和 'new' 关键字

java - react native : write in AsyncStorage with java

java - 我在 Java 中找不到这个compareTo(T) 函数的错误

java - 在 Java Swing 应用程序中实现 Spring Security

java - 使文件写入过程更快

java - 使用通用方法?

java - 如何创建一个扩展 EnumMap 并调用 super( K.class ) 的通用类 Enum<K> ?

generics - 在 Rust 泛型函数中什么时候将输入作为 T 或 &T?