我想要一个实现接口的类,该接口指定特定的子类作为参数。
public abstract Task implements TaskStatus<Task> {
TaskStatus<T> listener;
protected complete() {
// ugly, unsafe cast
callback.complete((T) this);
}
}
public interface TaskStatus<T> {
public void complete(T task);
}
但我想保证使用的 type-arg 不仅仅是任务或 ,而是扩展该类的特定类的类型参数。
所以我想出的最好的办法是:
public abstract Task<T extends Task> implements TaskStatus<T> {
}
你可以通过写来扩展它:
public class MyTask extends Task<MyTask> {
}
但这也是有效的:
public class MyTask extends Task<SomeOtherTask> {
}
并且回调的调用将会因ClassCastException而爆炸。那么,这种方法是错误的并且被破坏了,还是有一种正确的方法可以做到这一点,我不知何故错过了?
目前尚不清楚你想在里面做什么Task
。但是,如果您定义泛型类Task<T>
如下:
class Task<T extends Task<T>> { ... }
以下两种是可能的:
class MyTask extends Task<MyTask> { ... }
class YourTask extends Task<MyTask> { ... }
但禁止以下行为:
class MyTask extends Task<String> { ... }
上面的定义Task
使用 F-bounded 多态性,这是一个相当高级的功能。您可以查看研究论文“面向对象编程的 F 有界多态性 http://www.cs.utexas.edu/~wcook/papers/FBound89/CookFBound89.pdf“ 了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)