[英]Class abstraction and 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
应该返回什么才能编译(并且正确)?
你可以return Class.class.cast(HashSet.class);
哪个会编译,但会给你一个未经检查的分配警告。
你实际做的是某种程度上相当于这个,
public class VerticalCheckBoxSelect<T> extends CustomField<Set> {
@Override
public Class<? extends Set> getType() {
return ???;
}
}
请注意,在第一行它表示extends CustomField<Set>
,这意味着public abstract Class<? extends T> getType()
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
像HashSet
,然后更换上述Set.class
与HashSet.class
:
public class VerticalCheckBoxSelect<T> extends CustomField<Set<T>> {
@Override
public Class<? extends Set<T>> getType() {
@SuppressWarnings("unchecked")
Class<Set<T>> r = (Class) HashSet.class;
return r;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.