我有以下基本课程
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
的情况下起作用?
答案 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,然后将为您生成它。
@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);