当我使用类型参数创建一个类时:
public abstract class AbstractBox<T> {
abstract T getContent();
}
然后我仍然可以创建一个没有类型参数的子类:
class SomeBox extends AbstractBox { // DISALLOW THIS
@Override
Something getContent() {
return null;
}
}
我可以以某种方式强制子类提供类型参数(即使它只是Object
)?例如,我想禁止上述内容但允许:
class SomeBox extends AbstractBox<Something> { // ALLOW THIS
@Override
Something getContent() {
return null;
}
}
编辑:这不是Can overridden methods differ in return type?的重复。该问题询问重写方法是否可以返回type参数的子类型。
我的问题是,我是否可以强制使用类型参数的抽象的任何子类必须提供类型参数。
答案 0 :(得分:3)
如果要在扩展时检查AbstractBox
是否提供了类型参数,可以执行以下操作:
abstract class AbstractBox<T> {
protected AbstractBox() {
// First, find the direct subclass of AbstractBox
Class<?> cls = getClass();
while(cls.getSuperclass() != AbstractBox.class)
cls = cls.getSuperclass();
// Then, check if it's superclass is parametrized
if (!(cls.getGenericSuperclass() instanceof ParameterizedType)) {
throw new RuntimeException("Must parametrize the extension of AbstractBox.");
}
}
abstract T getContent();
}
首先需要获取直接子类,以便在直接子类使用参数扩展AbstractBox
的情况下不会中断,然后再次进行子类化。
请注意,这也会接受SomBox extends AbstractBox<String>
。