如何在Java子类中引用父类的泛型类型?

时间:2018-12-25 04:21:27

标签: java generics types reference

我有以下基本课程

class Base<T> {
    // ...
}

我有这个类来扩展Base

class Derived extends Base<String> {
    public void doSomething(String param) { // this works

    }

    public void doSomething(Base::T param) { // this DOES NOT work

    }
}

我想知道是否存在Java技巧来使第二个函数定义在不直接使用具体类String的情况下起作用?

2 个答案:

答案 0 :(得分:3)

  

是的,我有理由。有许多类需要用不同的具体类型扩展Base。我想避免在每个类中更改功能签名,如果可能的话,应该避免这种情况。

如果您有很多需要扩展Base<T>类的类,并且它们都具有doSomething方法,则可能应该将doSomething放在Base<T>中:

class Base<T> {
    public void doSomething(T param) {} // or even make this abstract
}

然后,像IntelliJ IDEA这样的IDE可以为您生成重写的方法。当您开始输入方法名称时,将弹出:

enter image description here

您按Enter,然后将为您生成它。

@Override
public void doSomething(String param) {
    super.doSomething(param);
}

我怀疑您可能会复制并粘贴doSomething的实现,因为否则您为什么认为为每个实现更改参数类型很烦人?

如果实现基本相同,请考虑在doSomething中使用Base<T>方法,然后将不同的部分提取到doSomethingImpl方法中,该方法将被派生方法覆盖课程。

答案 1 :(得分:0)

为了将不同的参数传递给您的方法,您可以实现上限类型参数。

class Derived<T extends Foo> extends Base<Foo> {
   public void doSomething(Foo param) { // this works

   }
}

public <T extends Foo> void doSomething(List<T> foos) {}
public void doSomething(List<Foo> foo) {}

给出:class Bar extends Foo { }

List<Bar> list = new ArrayList<Bar>();
doSomething(list);