Java 使用不同的T类调用print(列表<;T>;a、T b)时出错
我试图学习Java泛型,并发现了以下代码Java 使用不同的T类调用print(列表<;T>;a、T b)时出错,java,generics,Java,Generics,我试图学习Java泛型,并发现了以下代码 public static <T> void print(T a, T b){ System.out.println(a); System.out.println(b); } public static void main(String[] args){ print(new ArrayList<String>(), 1); } 错误: GenericTest.java:9: error: method
public static <T> void print(T a, T b){
System.out.println(a);
System.out.println(b);
}
public static void main(String[] args){
print(new ArrayList<String>(), 1);
}
错误:
GenericTest.java:9: error: method print in class GenericTest cannot be applied to given types;
print(new ArrayList<String>(), 1);
^
required: List<T>,T
found: ArrayList<String>,int
reason: no instance(s) of type variable(s) T exist so that argument type int conforms to formal parameter type T
where T is a type-variable:
T extends Object declared in method <T>print(List<T>,T)
1 error
GenericTest.java:9:错误:类GenericTest中的方法print无法应用于给定类型;
打印(新的ArrayList(),1);
^
必填项:列表,T
找到:ArrayList,int
原因:不存在类型变量T的实例,因此参数类型int符合形式参数类型T
其中T是一个类型变量:
T扩展方法print中声明的对象(列表,T)
1错误
有人能帮我理解错误吗?编辑:它没有像我提到的那样解析为Object,而是可以序列化 在第一种情况下,
T
被解析为可以引用两个参数的最具体的类型
在您的示例中,它将解析为对象
可序列化
,因为数组列表
和整数
都是对象
可序列化子类型
但在第二个示例中,您有一个列表
作为参数
现在,当您使用
ArrayList
调用它时,类型T
将解析为字符串。它不能解析为任何其他类型,因为ArrayList
ArrayList
不是ArrayList
的超类型,您首先应该了解的是,使用以下方法签名
public static <T> void print(T a, T b)
public static <T> void print(List<T> a, T b)
没有对List
和Integer
都有效的通用超类型T
。确实,String
和Integer
都是可序列化的,但由于它不起作用。您可以通过以下方式调用该方法:
print(new ArrayList<String>(), "SimpleString");
print(新的ArrayList(),“SimpleString”);
或
打印(新的ArrayList(),5)
因为
是一种类型,不能同时为字符串和整数
如果您这样做,您的呼叫可能会起作用:
public static <T, K> void print(List<T> a, K b){
System.out.println(a);
System.out.println(b);
}
public static void main(String[] args){
print(new ArrayList<String>(),1);
}
公共静态无效打印(列表a、K和b){
系统输出打印项次(a);
系统输出打印ln(b);
}
公共静态void main(字符串[]args){
打印(新的ArrayList(),1);
}
您还可以解释为什么它被解析为可序列化的
而不是任何其他通用超类型吗?@Codebender,因为它是数组列表
和整数
之间最接近的通用超类型<代码>对象将是层次结构中的一个级别。我不知道接口和类之间的层次结构是如何形成的(我将就此提出一个新问题),但eclipse显示它已被解析为可序列化(+1)…@Codebender简单地说,创建层次结构树(在eclipse中,在类型上按F4并显示超类型层次结构)每升一级加1。ArrayList和Integer所共有的最小计数的类型是可序列化的。@Xin,擦除与您的场景没有任何关系(是的,在运行时它将是对象,因为擦除)。。。你的是关于推理的…这是最好的答案,因为它是唯一一个有两个类型参数的代码。因为语法对初学者来说不一定是直观的。这个例子阐明了如何使用它。干得好。明天将+1(投票限制)。
print(new ArrayList<Integer>(),5)
public static <T, K> void print(List<T> a, K b){
System.out.println(a);
System.out.println(b);
}
public static void main(String[] args){
print(new ArrayList<String>(),1);
}