有没有办法在编译时对参数强制执行子类类型?
类似于this
而不是实例 - 类?
我有课程:
public abstract class Animal {
public abstract void follow(Animal a); // <-- how to declare it?
}
但我希望子类永远不要使用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
}
}
我希望Fish
仅使用Fish
类型的参数,而不是Animal
,这与另一个子类Parrot
仅使用Parrot
参数的方式相同关于方法follow()
。
我强烈希望在编译时强制执行此操作,但如果没有其他可能,则运行时是一个(不太理想的)选项。
答案 0 :(得分:4)
这有一个诀窍。
从设计的角度来看,它很难看,但它会在你的情况下起作用。
首先要做的事情:请注意,使用useLiveLayout=false
进行参数化并在运行时检查类型并没有什么问题。
以下是如何使用与方法签名相同类型的参数强制继承:
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
}
}
,使用follow
进行参数化(并在签名中仅使用<T extends Animal>
),但是您无法强制执行T
Fish
课程中的签名。