java - 警告 : A generic array of Object&Serializable&Comparable<? > 是为可变参数创建的

标签 java generics programming-languages

如果我用不同类的对象调用一个(通用的)可变参数方法,我会收到一个有趣的警告:

List<?> result =  Arrays.asList("1", 1);

A generic array of Object&Serializable&Comparable is created for a varargs parameter

我可以通过转换为通用接口(interface)或类来消除警告,

List<Serializable> result = asList((Serializable) "1", (Serializable) 1);

但是 Object&Serializable&Comparable<?> 是什么意思?意思是?它是否也可以用于方法签名的泛型类型注释(如 extendssuper )?

最佳答案

类(class)Object和接口(interface) ComparableSerializable是类 Integer 的父类(super class)型和 String有共同点。

由于泛型中的类型删除和数组的协变性,泛型和数组不能很好地相互混合。方法Arrays#asList将可变参数作为输入,在 Java 中,可变参数在内部是用数组实现的。因此警告。 (您可以在 Josh Bloch 的 Effective Java 中阅读更多相关信息。)

现在来回答你的第二个问题,<Object & Comparable<Whatever> & Serializable>可以在方法签名中使用以指定对类型参数的约束。 (请参阅 this answer。)然而,Java 不允许在泛型类型注释中使用此类类型。

换句话说,以下是有效的:

public static void <A extends Comparable<A> & Serializable> meth(A a);

但以下不是:

List<Serializable & SomeOtherInterface> list = ...;

关于java - 警告 : A generic array of Object&Serializable&Comparable<? > 是为可变参数创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4282517/

相关文章:

java - Log4j 是一个死项目吗?

java - C++ 到 java 数组的转换

java - 访问maven生成的jar中资源目录中的文件

javascript - 为什么 'this' 分辨率在 JavaScript 中如此特殊?

ruby-on-rails - Ruby on Rails 开发代码真的快得多吗?

java - 我可以为 GLES20.glDrawElements 函数提供多少个索引?

c# - 泛型与接口(interface)的实际优势

c - C 中的通用列表操作函数?

java - 带有扩展超过一种类型的参数的列表

c - 从一个简单的(也许是最简单的)C 编译器开始?