我需要扩展一个我无法修改的抽象类:
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
应该返回什么才能编译(和正确)?
答案 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