我有一堆简单的接口:
interface County extends Line{}
interface Country<C extends Line> extends LineContainer<C> {}
interface Line {}
interface LineContainer <L extends Line> {
public List<L> getLines();
}
和服务方法
public static <L extends Line,C extends LineContainer<L>> C getContainer( Class<C> containerType, Class<L> lineType ){
...somthing...
调用服务方法
Country<County> c = getContainer( Country.class, County.class );
面对没有错误,但检查员说:
Type safety: The expression of type Country needs unchecked conversion to conform to Country
我不明白:
通过使用County作为L-LineType调用服务方法,C是L的容器,C由Country作为C-Type,因此,我期望类型推断将得出结论,将提供Country对象.
任何人都可以解释,为什么我错了,我是否以及如何实现我想要的目标?
背景:这个想法是 – 作为服务的用户 – 我可以根据需要自由组合容器和线路(只要服务提供商可以提供服务)
最佳答案 这是因为编译器不确定Country.class是否与签名Country< County>匹配. Country.class被视为原始类型.
如果你这样写:
public static <L extends Line, C extends LineContainer<L>> C getContainer(C container, Class<L> lineType) {
return null;
}
和:
Country<County> c = getContainer(new Country<County>() {
@Override
public List<County> getLines() {
return null;
}
}, County.class);
显然这是行得通的.
现在假设我将相同的代码分成另一种方式:
Country foo = new Country<County>() {
@Override
public List<County> getLines() {
return null;
}
};
Country<County> c = getContainer(foo, County.class);
由于原始类型,这将在编译时再次发出警告.