[英]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.