gpt4 book ai didi

java - 泛型方法参数行为

转载 作者:搜寻专家 更新时间:2023-11-01 03:31:13 24 4
gpt4 key购买 nike

考虑下面的通用方法程序:

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 调用了该方法,因此它为 T 调用了 Object 的方法。第 25 行也是如此,因为 List 也具有 Object 类型,它为 T 调用了 Object 的方法。调用 List with其他类型会产生错误。我的推断是否正确?

我想不到的是

1)第28行,传入String和class,

2) 当传递两个不同的类时第30行,

3) 第 34 行,当没有类型声明的列表作为参数传递时。

任何人都可以分享他们的知识来澄清我的理解。任何帮助,将不胜感激!谢谢!

最佳答案

Calling List with other type will produce an error. Is my inference correct?

是的;你不能传递 List<String>那里,例如。通常,您的第二个 addList 方法的意图是错误的。正确的签名是这样的:

public <T> List<T> addList(T t1, T t2, List<? extends T> list)

注意 ? extends句法。如果您所做的只是从列表中读取,则没有理由不添加它。 T 的某些特定子类型的列表保证包含 T。完全不同的原因是:如果您想ADD 到这个列表怎么办?假设 T 是 Number然后你传入 Integer 的列表.双是一个数字。与 List<T> list你可以打电话list.add(5.0)它会编译并运行,将 double 放入您的整数列表中。用List<? extends T> , add 调用始终是编译器错误(除非您尝试添加 null 这会起作用)。对于阅读,你会得到一个 T出去,不管你调用getList<? extends T> 上或 List<T> ,没关系。

1) Line 28 when String and class is passed,

不,您正在传递一个 String 类型的实例和一个 GenericTest 类型的实例。 String 和 GenericTest 一样都是一个类。字符串并不特殊。这与您在第 21 行中的调用完全相同:您传递了 2 个表达式;一个对象类型为 X,另一个对象类型为 Y。因此,T被推断为两个传递的实例之间最具体的共享类型(可能是所谓的 lub 类型:一组类型)。对于第 21 行,IntegerString最具体的共享类型就是 Object (从技术上讲,实际上它是 lub 类型 Object & Serializable ,但这在这里并不重要)。在第 28 行,它是 String 之间最具体的共享类型。和 GenericTest这仍然是 Object , 没有区别。

2) Line 30 when two different class is passed,

见上;完全一样的情况。 GenericTest 之间最具体的共享类型和 GenericMethodObject .

3) Line 34 when List declared without type is passed as argument.

表达式lst第 34 行是“原始”类型 ArrayList .当您使用原始类型时,会发生两件事:[1] 编译器会警告您您正在使用原始类型,并且 [2] 对于涉及任何原始类型的任何调用,几乎所有泛型测试和检查都被禁用,因此,编译器只会让这种情况发生。

请记住,泛型是编译器想象力的产物。他们的意思是让编译器告诉您您的代码已损坏。就这样。

关于java - 泛型方法参数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54062340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com