繁体   English   中英

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

[英]How to refer the generic type of super class in subclass in Java?

我有以下基础课

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

我有这个课来扩展基础

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

    }

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

    }
}

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

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

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

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

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

在此处输入图片说明

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

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

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

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

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

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM