我有以下情况:
abstract class X { abstract X someMethod (...) {...} }.
现在我想约束X的任何实现,让它的'someMethod'方法返回特定的实现类型,而不仅仅是X:
class X1 extends X { X1 someMethod (...) {...} }.
class X1 extends X { X someMethod (...) {...} }. //want this to be flagged as an error
class X2 extends X { X1 someMethod (...) {...} }. //want this to be flagged as an error too
是否可以使用Java泛型实现此目的?
修改
好。我只问了是/否问题并得到了“是”。我的错。我真正感兴趣的是“我如何编写声明”。
答案 0 :(得分:18)
这也有效;
abstract class X<T> {
public abstract T yourMethod();
}
class X1 extends X<X1> {
public X1 yourMethod() {
return this;
}
}
class X2 extends X<X2> {
public X2 yourMethod() {
return this;
}
}
答案 1 :(得分:4)
abstract class X<I extends X<I>> {
protected X(Class<I> implClazz) {
if (!getClass().equals(implClazz)) {
throw new IllegalArgumentException();
}
}
abstract I someMethod();
}
基本原理:你不能在类型边界中引用动态类型,因此在构造函数中间接检查。
答案 2 :(得分:2)
这是一种允许您返回this
的参数类型的方法:
AbstractFoo<T extends AbstractFoo<T>> {
/** Subclasses must implement to return {@code this}. */
protected abstract T getThis();
/** Does something interesting and returns this Foo */
public T inheritedThing {
/* blah di blah */
return getThis();
}
}
答案 3 :(得分:1)
答案 4 :(得分:0)
这应该可以正常工作:
class X<T> {
abstract T someMethod(...);
}
class X1<T1> extends X
T1 someMethod(...) {
...
}
}