【发布时间】:2019-01-06 14:11:34
【问题描述】:
考虑下面的通用方法程序:
class GenericTest {
int i;
}
public class GenericMethod {
public <T> List<T> addList(T t, T t1) {
List<T> list=new ArrayList<T>();
list.add(t);
list.add(t1);
return list;
}
public <T> List<T> addList(T t, T t1, List<T> l) {
List<T> list=new ArrayList<T>();
list.add(t);
list.add(t1);
list.addAll(l);
return list;
}
public static void main(String[] args) {
GenericMethod gm=new GenericMethod();
List l=gm.addList(new Integer(42), "java"); //Line 21
System.out.println(l);
List<Object> list = new ArrayList<Object>();
list.add(false);
List l2 = gm.addList("java", new Integer(42), list); //Line 25
System.out.println(l2);
GenericTest gt = new GenericTest();
List l3 = gm.addList("java", gt); //Line 28
System.out.println(l3);
List l4 = gm.addList(gm, gt); //Line 30
System.out.println(l4);
List lst = new ArrayList();
lst.add(new Object());
List l5 = gm.addList("java", new Integer(42), lst); //Line 34
System.out.println(l5);
System.out.println(l5.get(0));
}
}
通过参考链接Java Generics - Confusing behavior 我推断,
在第 21 行中,由于该方法同时使用 String 和 Integer 调用,因此它使用 Object 调用 T 的方法。第 25 行也是如此,因为 List 也具有 Object 类型,它使用 Object 调用 T 的方法。调用 List 使用其他类型会产生错误。我的推断正确吗?
我想不到的是关于
1) 传递String和class时的第28行,
2) 传递两个不同类时的第 30 行,
3) 第 34 行,当 List 声明为无类型时作为参数传递。
任何人都可以分享他们的知识以澄清我的理解。任何帮助,将不胜感激!谢谢!
【问题讨论】:
-
如果你停止使用原始类型并弄清楚你的列表是什么数据类型,你可以清楚地理解所有这些......另一方面,你所有的方法调用都很容易解释使用根据哪个参数映射到哪个
addList方法调用的参数数量。
标签: java generics methods collections