类抽象和泛型

时间:2015-07-20 15:26:15

标签: java generics

我需要扩展一个我无法修改的抽象类:

public abstract class CustomField<T> extends AbstractField<T> implements HasComponents {
    // some code

    @Override
    public abstract Class<? extends T> getType();

    // some code
}

使用这样的通用类:

public class VerticalCheckBoxSelect<T> extends CustomField<Set<T>> {

    @Override
    public Class<? extends Set<T>> getType() {
        return ???;
    }

}

我的问题很明显:VerticalCheckBoxSelect::getType应该返回什么才能编译(和正确)?

2 个答案:

答案 0 :(得分:3)

你可以return Class.class.cast(HashSet.class);

哪个会编译,但会给你一个未选中的作业警告。

答案 1 :(得分:1)

说明

你实际上做的是某种程度上等同于此,

public class VerticalCheckBoxSelect<T> extends CustomField<Set> {

    @Override
    public Class<? extends Set> getType() {
        return ???;
    }
}

请注意,在第一行显示extends CustomField<Set>,这意味着public abstract Class<? extends T> getType()应该以始终返回Class<Set>的方式实现,因此您的实现应该是:

public class VerticalCheckBoxSelect<T> extends CustomField<Set<T>> {

    @Override
    public Class<? extends Set<T>> getType() {
        @SuppressWarnings("unchecked")
        Class<Set<T>> r = (Class) Set.class;
        return r;
    }
}

上面的代码现在完全可以编译。试试吧!

现在,假设您希望它是Set的{​​{1}}的任意子类,然后将HashSet替换为Set.class

HashSet.class