泛型在参数上强制子类Java类型
有没有办法在编译时对参数强制使用子类类型
类似于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
在方法follow()
上只使用Parrot
参数一样
我强烈希望在编译时执行这一点,但如果没有其他可能,运行时是一个(不太理想的)选项
# 1 楼答案
这其中有一个诀窍
从设计的角度来看,这很难看,但它在你的情况下会起作用
首先:请注意,使用
Animal
参数化并在运行时检查类型并没有什么问题下面是如何使用与方法签名相同的类型参数强制执行继承:
您也可以声明一个泛型方法
follow
,改为用<T extends Animal>
参数化(并且只在签名中T
),但不能在Fish
类的签名中强制Fish