强制子类使用类型参数

时间:2018-04-06 07:58:48

标签: java generics

当我使用类型参数创建一个类时:

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参数的子类型。

我的问题是,我是否可以强制使用类型参数的抽象的任何子类必须提供类型参数。

1 个答案:

答案 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>

的情况