The*_*ler 4 java generics parameters inheritance
有什么方法可以在编译时对参数强制使用子类类型吗?
类似this但不适合实例 - 对于类?
我有课程:
public abstract class Animal {
public abstract void follow(Animal a); // <-- how to declare it?
}
Run Code Online (Sandbox Code Playgroud)
但我希望子类永远不要使用基类Animal,而只使用它自己(派生类)作为参数:
public class Fish extends Animal {
@Override
public void follow(Fish f) { // error here, since it expects Animal
tagAlong(f);
}
private void tagAlong(Fish f) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
我希望 aFish仅使用类型的参数Fish,而不是Animal像另一个子类Parrot仅使用Parrot方法上的参数一样follow()。
我强烈希望在编译时强制执行此操作,但如果没有其他可能,则运行时是一个(不太理想的)选项。
这有一个技巧。
从设计的角度来看,它很丑陋,但它适用于您的情况。
首先,请注意,使用 进行参数化Animal并在运行时检查类型并没有什么问题。
以下是如何使用相同类型的参数作为方法签名来强制继承:
// made class generic
public abstract class Animal<T extends Animal<T>> {
public abstract void follow(T a);
}
// parametrizes with own type
public class Fish extends Animal<Fish> {
@Override
public void follow(Fish a) {
// compiles
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以声明一个通用方法follow,用<T extends Animal>(并且仅T在签名中)进行参数化,但不能Fish在类中的签名中强制执行Fish。