List<List<?>> 和 List<List> 是 java 中不兼容的类型
List<List<?>> and List<List> are incompatible types in java
我没有得到这段代码以任何方式编译:
List<List> a = new ArrayList();
List<List<?>> b = new ArrayList();
a = b; // incompatible types
b = a; // incompatible types
似乎java在泛型方面不认为List
和List<?>
是同一类型。
这是为什么?有什么好的出路吗?
上下文
有一个具有以下签名的库函数:public <T> Set<Class<? extends T>> getSubTypesOf(final Class<T> type)
。这适用于作为参数传递的简单类型,但在泛型的情况下,结果未使用通配符进行参数化,导致 javac 抱怨原始类型。我想将结果作为 Set<Class<? extends GenericTypeHere<?>>>
传播到我的应用程序的其余部分,但简单的转换并不像我预期的那样工作。
编辑:解决方案
感谢您的回答,下面是我最终的工作方式:
@SuppressWarnings({"rawtypes", "unchecked"})
private static Set<Class<? extends GenericTypeHere<?>>> factoryTypes() {
return (Set) new Reflections("...").getSubTypesOf(GenericTypeHere.class);
}
List<? extends List> a = new ArrayList();
List<? extends List<?>> b = new ArrayList();
a = b;
有效
Set<Class<? extends GenericTypeHere<?>>>
会暗示
Set<Class<YourClass extends AnotherClass<YourClass>>>
如上述通配符答案所述
是什么阻止了您使用
Set<Class<YourClass extends AnotherClass>>
在整个应用程序中传播?
好的,这是由于细微的语义差异造成的。
List
这是 List
的原始类型,相当于 T
属于 Object
类型。所以这等同于说:
List<Object>
现在,编译器知道一个事实,无论发生什么,这是类型 Object
的子类。如果你这样做..
List myList = new ArrayList();
myList.add(new Object());
它会很好用!这是因为 Object
相同或者是该类型的一些派生。
List<?>
这实际上是未知列表 (Java Docs)。我们甚至不知道这里的东西的子类是Object
类型的。事实上,?
类型本身就是一个未知类型。跟Object
没关系!这就是为什么当你尝试做的时候..
List<?> myList = new ArrayList<?>();
myList.add(new Object());
您遇到编译时错误!
我没有得到这段代码以任何方式编译:
List<List> a = new ArrayList();
List<List<?>> b = new ArrayList();
a = b; // incompatible types
b = a; // incompatible types
似乎java在泛型方面不认为List
和List<?>
是同一类型。
这是为什么?有什么好的出路吗?
上下文
有一个具有以下签名的库函数:public <T> Set<Class<? extends T>> getSubTypesOf(final Class<T> type)
。这适用于作为参数传递的简单类型,但在泛型的情况下,结果未使用通配符进行参数化,导致 javac 抱怨原始类型。我想将结果作为 Set<Class<? extends GenericTypeHere<?>>>
传播到我的应用程序的其余部分,但简单的转换并不像我预期的那样工作。
编辑:解决方案
感谢您的回答,下面是我最终的工作方式:
@SuppressWarnings({"rawtypes", "unchecked"})
private static Set<Class<? extends GenericTypeHere<?>>> factoryTypes() {
return (Set) new Reflections("...").getSubTypesOf(GenericTypeHere.class);
}
List<? extends List> a = new ArrayList();
List<? extends List<?>> b = new ArrayList();
a = b;
有效
Set<Class<? extends GenericTypeHere<?>>>
会暗示
Set<Class<YourClass extends AnotherClass<YourClass>>>
如上述通配符答案所述
是什么阻止了您使用
Set<Class<YourClass extends AnotherClass>>
在整个应用程序中传播?
好的,这是由于细微的语义差异造成的。
List
这是 List
的原始类型,相当于 T
属于 Object
类型。所以这等同于说:
List<Object>
现在,编译器知道一个事实,无论发生什么,这是类型 Object
的子类。如果你这样做..
List myList = new ArrayList();
myList.add(new Object());
它会很好用!这是因为 Object
相同或者是该类型的一些派生。
List<?>
这实际上是未知列表 (Java Docs)。我们甚至不知道这里的东西的子类是Object
类型的。事实上,?
类型本身就是一个未知类型。跟Object
没关系!这就是为什么当你尝试做的时候..
List<?> myList = new ArrayList<?>();
myList.add(new Object());
您遇到编译时错误!