如果我用不同类的对象调用一个(通用的)可变参数方法,我会收到一个有趣的警告:
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<?>
是什么意思?意思是?它是否也可以用于方法签名的泛型类型注释(如 extends
或 super
)?
最佳答案
类(class)Object
和接口(interface) Comparable
和 Serializable
是类 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/