java - 与 Arrays.asList() 不兼容的类型

标签 java generics

在下面的示例中,如果列表中有多种类型,它可以编译,但如果我有一个元素,它会选择另一种不再可分配的类型。

// compiles fine
List<Class<? extends Reference>> list = Arrays.asList(SoftReference.class, WeakReference.class);
// but take an element away and it no longer compiles.
List<Class<? extends Reference>> list2 = Arrays.asList(WeakReference.class);
// without giving the specific type desired.
List<Class<? extends Reference>> list3 = Arrays.<Class<? extends Reference>>asList(WeakReference.class);

我确信对此有一个合乎逻辑的解释,但它逃脱了我。

    Error:Error:line (30)error: incompatible types
required: List<Class<? extends Reference>>
found:    List<Class<WeakReference>>

为什么有两个元素可以编译而一个元素不能编译?

顺便说一句:如果你尝试,很难找到一个简单的例子

List<Class<? extends List>> list = Arrays.asList(ArrayList.class, LinkedList.class);

    Error:Error:line (28)error: incompatible types
required: List<Class<? extends List>>
found:    List<Class<? extends INT#1>>
where INT#1 is an intersection type:
INT#1 extends AbstractList,Cloneable,Serializable

这也不编译(它甚至不会解析)

List<Class<? extends AbstractList & Cloneable & Serializable>> list = Arrays.asList(ArrayList.class, LinkedList.class);

Error:Error:line (30)error: > expected
Error:Error:line (30)error: ';' expected

但这编译得很好

static abstract class MyList<T> implements List<T> { }
List<Class<? extends List>> list = 
        Arrays.asList(ArrayList.class, LinkedList.class, MyList.class);
List<Class<? extends List>> list = 
        Arrays.<Class<? extends List>>asList(ArrayList.class, LinkedList.class);

编辑:基于 Marko 的示例。在这四个示例中,一个不编译,其余的生成相同类型的相同列表。

List<Class<? extends Reference>> list = new ArrayList<>();
list.add(SoftReference.class);
list.add(WeakReference.class);
list.add(PhantomReference.class);

List<Class<? extends Reference>> list = new ArrayList<>(
     Arrays.asList(SoftReference.class));
list.add(WeakReference.class);
list.add(PhantomReference.class);

List<Class<? extends Reference>> list = new ArrayList<>(
     Arrays.asList(SoftReference.class, WeakReference.class));
list.add(PhantomReference.class);

List<Class<? extends Reference>> list = new ArrayList<>(
     Arrays.asList(SoftReference.class, WeakReference.class, PhantomReference.class));

最佳答案

有趣的问题。我认为正在发生的事情是这样的。当你有两个像你展示的元素时,返回类型来自 asList是所有参数中最具体的类型,在您的第一个示例中是 List<Reference> .这与 List<? extends Reference> 的分配兼容.当您只有一个参数时,返回类型是参数的特定类型,它不是赋值兼容的,因为泛型不是协变的。

关于java - 与 Arrays.asList() 不兼容的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14091771/

相关文章:

java - session 过期后自动注销

java - 合并两个服务?

java - 根据通用类,使用 jackson 和动态 json 键将通用 POJO 转换为 JSON

scala - 使用ScalaQuery的通用存储库

java - Mockito.any() 通过泛型接口(interface)

用于处理转义分隔符和转义转义字符的 Java String.split() 正则表达式

java - 跨多个 JVM 动态设置 Log4j 级别

Java 线程在记录器上被阻止

delphi - 泛型和 As Cast 的问题

arrays - 创建通用多路复用器