Java 警告:对象的通用数组&;可序列化&;可比<&燃气轮机;是为varargs参数创建的

Java 警告:对象的通用数组&;可序列化&;可比<&燃气轮机;是为varargs参数创建的,java,generics,programming-languages,Java,Generics,Programming Languages,如果我使用不同类的对象调用(通用)varargs方法,我会得到一个有趣的警告: List<?> result = Arrays.asList("1", 1); List result=Arrays.asList(“1”,1); 为varargs参数创建了Object&Serializable&compariable的通用数组 我可以通过强制转换到公共接口或类来消除警告 List<Serializable> result = asList((Serializable)

如果我使用不同类的对象调用(通用)varargs方法,我会得到一个有趣的警告:

List<?> result =  Arrays.asList("1", 1);
List result=Arrays.asList(“1”,1);
为varargs参数创建了Object&Serializable&compariable的通用数组

我可以通过强制转换到公共接口或类来消除警告

List<Serializable> result = asList((Serializable) "1", (Serializable) 1);
List result=asList((可序列化)“1”,(可序列化)1);

但是
Object&Serializable&compariable
是什么意思呢?它也可以用于方法签名上的泛型类型注释(如
扩展
超级
)?

我认为,因为所有对象类型都是可序列化和可比较的(字符串和整数),所以编译器说数组中的所有元素都将具有对象类型,并实现可序列化和可比较的接口

我怀疑Serializable&Comparable是否可以在java代码中正常使用,您总是可以正常实现它们并收到相同的警告:-)

公共类CompariableAndSerializableClass实现了可比较、可序列化的{
公共静态void main(字符串[]args){
列表结果=Arrays.asList(“1”,1,新的ComparableAndSerializableClass());
对于(对象组件:结果){
System.out.println(comp.getClass());
}
}
@凌驾
public int compareTo(ComparableAndSerializableClass o){
返回0;
}
}

对象
和接口
可比较
可序列化
是类
整数
字符串
的共同超类型

由于泛型中的类型擦除和数组的协方差,泛型和数组不能很好地混合。方法
Arrays#asList
将varargs作为输入,在Java中,varargs在内部用数组实现。因此发出警告。(您可以在Josh Bloch的《高效Java》中了解更多有关这方面的内容。)

现在来看第二个问题,
可以在方法签名中用于指定类型参数的约束。但是,Java不允许在泛型类型注释中使用此类类型

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

public static void <A extends Comparable<A> & Serializable> meth(A a);
公共静态无效方法(A);
但以下情况并非如此:

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

如果您有一个像
Foo
这样的泛型类型,那么您可以使用助手方法为您调用
数组。asList()

public static List<Foo<?>> asList( Foo<?> ... foos ) {
    return Arrays.asList( foos );
}
public static List<Foo<?>> asList( Foo<?> ... foos ) {
    return Arrays.asList( foos );
}
public static <T> List<Foo<T>> asList( Foo<T> ... foos ) {
    return Arrays.asList( foos );
}