我使用泛型编写了一些代码,但遇到了以下我无法理解的情况:
我有接口 IpRange 和以下类:
public class Scope<IpRange<T extends IP>> {
List<IpRange<T>> rangesList;
public List<IpRange<T>> getRangesList() {return rangesList;}
}
如果我写以下内容,现在从一些测试类:
Scope<Ipv4> myScope = new Scope<Ipv4>();
scope.getRangesList().get(0)
我得到了 IpRange 类型的对象,但是如果我使用原始类型并这样做:
Scope myScope = new Scope();
scope.getRangesList().get(0)
我得到了对象,除非我明确地将它转换为范围,否则我不能使用 ipRange 方法。
如果是List<T>
我明白了,因为我使用原始类型,编译器无法知道列表项的实际类型是什么,但在这种情况下,它将始终是 IpRange 类型,所以为什么我没有得到 Object ?
问题是,当我创建范围时,我不一定知道实际的范围类型。考虑这个构造函数: public Scope(String rangeStringList); 据我所知,字符串可能是“16.59.60.80”或“fe80::10d9:159:f:fffa%”。但我所知道的是,我将一些 IpRange 对象传递给编译器,我希望能够使用这个接口,无论是 ipv4 还是 ipv6。而且由于即使我使用行类型,编译器也可以确定这是 ipRange,我想知道为什么 java 选择这样做