gpt4 book ai didi

Java 泛型 : Question regarding type capture and generated inference using generic methods

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:26:15 26 4
gpt4 key购买 nike

这是我上一个问题的后续问题,但由于上一个线程很长,我决定开始另一个与几乎相同主题相关的线程。

public class GenericMethodInference {

static <T> void test1(T t1, T t2) {}
static <T> void test3(T t1, List <T> t2) {}
static <T> void test4(List <T> t1, List <T> t2) {}

public static void main(String [] args) {

List <Object> c = new LinkedList<Object>();
List <? extends Object> d = new ArrayList<Integer>();
List e = new ArrayList<Integer>();

test1("Hello", new Integer(1)); // ok clause (1)
GenericMethodInference.<Object>test1("Hello", new Integer(1)); // ok clause (2)
test3("Hello", c); // ok clause (3)
test4(d,d) // clause (4) Error due to different type capture generated

}

注意:如果将光标移到每个子句上,您将看到正在生成的推理并显示在 Eclipse 上:

一个。条款 (1) 将产生 test1 b.子句 (2) 将生成实际类型参数中定义的内容
C。第 (3) 条将产生 test3 >

问题:

  1. 为什么第 (1) 条没有产生 ?由于 的工作方式如第 (2) 节所示,为什么 被生产出来了吗?
  2. 为什么第 (3) 条产生 而不是
  3. 既然第(4)条使用了同一个变量,为什么使用的参数是同一个变量d,却生成了2个不同类型的捕获?
  4. 最佳答案

    Why clause (1) didn't produce <Object>? Since <Object> works as shown in clause (2), why <? extends Object> being produce instead?

    这是三个问题中最好的一个。我的想法是,编译器/Eclipse 不想假设 Object 必然是 TString 之间推断的类型,因此它可以安全运行。正如 @bringer128 指出的那样,IntegerString 也都实现了 IntegerSerializable - 因此这些类型也是方法的推断类型的候选者。

    值得注意的是,下面的代码给出了编译器错误“类型的非法开始”:

    GenericMethodInference.<? extends Object>test1("Hello", new Integer(1));

    这是因为将通配符指定为方法的类型参数是无效的。因此,您在工具提示中看到的事实与编译器/Eclipse 报告此信息的工具的微妙之处有关 - 它只确定 Comparable 在其范围内,而不是它是什么。

    请记住,Java 的泛型实现只是为了程序员的方便/理智。一旦编译成字节码,type erasure 将摆脱 T 的任何概念。所以在检查时,编译器只需要确保可以推断出一个有效的T,但不一定是什么。


    why clause (3) produce <Object> instead of <? extends Object>?

    因为在这种情况下,在需要 T 的地方传递了 List<Object> 这一事实告诉编译器 List<T> 就是 T


    Since clause (4) uses the same variable, why 2 different type capture generated eventhough the parameter used is of the same variable d?

    编译器假设 Object 实际上指的是同一个对象是不安全的,即使在评估参数之间也是如此。例如:

    test4(d,(d = new ArrayList<String>()));

    在这种情况下,一个 d 将被传递到第一个参数,一个 List<Integer> 将被传递到第二个 - 两者都来自 List<String> 。由于这种情况是可能的,因此编译器更容易安全地使用它。

    关于Java 泛型 : Question regarding type capture and generated inference using generic methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7578215/

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