作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一堆简单的接口(interface):
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);
由于原始类型,这将在编译时再次发出警告。
关于java - 泛型的类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50757383/
我是一名优秀的程序员,十分优秀!