Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用不同的T类调用print(列表<;T>;a、T b)时出错_Java_Generics - Fatal编程技术网

Java 使用不同的T类调用print(列表<;T>;a、T b)时出错

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

我试图学习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 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);
}