gpt4 book ai didi

Java 为什么无法在编译时确定泛型类型的方法重载

转载 作者:行者123 更新时间:2023-12-02 04:13:30 25 4
gpt4 key购买 nike

我想知道为什么下面的代码不能使用编译时泛型类型信息来正确查找最具体的方法重载,而是始终使用适用于所有潜在泛型参数的方法。有没有办法在编译时切换通用参数类型以避免运行时出现令人讨厌的反射?

import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class Temp {
class A<T> {
T x;
A(T x) {
this.x = x;
}
String bar = foo(x);

private String foo(Integer i) {
return "Int";
}
private String foo(String i) {
return "String";
}
private <T> String foo(List<T> l) {
return "List";
}
private <T> String foo(T v) {
return "Value";
}
}

@Test
public void IntTest() {
Assert.assertEquals(new A<Integer>(1).bar, "Int");
}
@Test
public void StringTest() {
Assert.assertEquals(new A<String>("A").bar, "String");
}
@Test
public void ListTest() {
Assert.assertEquals(new A<List<String>>(new ArrayList<String>()).bar, "List");
}
@Test
public void LongTest() {
Assert.assertEquals(new A<Long>(1L).bar, "Value");
}
}

最佳答案

这是因为编译器必须生成不同的类 A对于用于 T 的每种类型(因为 A.bar 的初始化程序需要调用不同的方法)。决定只生成一个类。这与例如不同C++,编译器为所有使用的类型参数生成新类型。

换句话说,类型 A<String> 的编译代码与类型 A<Integer> 不同,但编译后只有类型 A .

关于Java 为什么无法在编译时确定泛型类型的方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16083038/

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