Java:实验泛型

Java:实验泛型,java,generics,Java,Generics,最后,我尝试了一些泛型。我想出了这段代码: public class Test { static <T> void f(T x) { x = (T) (Integer) 1234; System.out.println(x); } public static void main(String[] args) { f("a"); f(1); f('a'); f(1

最后,我尝试了一些泛型。我想出了这段代码:

public class Test {

    static <T> void f(T x) {
        x = (T) (Integer) 1234;
        System.out.println(x);
    }

    public static void main(String[] args) {
        f("a");
        f(1);
        f('a');
        f(1.5);
        f(new LinkedList<String>());
        f(new HashMap<String, String>());
    }
}
没有例外!这是怎么可能的呢?

这是因为(关于这一点,已经有很多人写了,只有谷歌这个词)。将
f
编译为字节码后,该方法可能如下所示:

static void f(Object x) {
    x = (Object) (Integer) 1234;
    System.out.println(x);
}

因此,
System.out.println
将只调用对象
x
上的
toString
方法,而在您的情况下,由于类型擦除,它是。发件人:

Java语言中引入了泛型以提供更紧密的类型 在编译时进行检查,以支持泛型编程。到 实现泛型,Java编译器将类型擦除应用于:

  • 将泛型类型中的所有类型参数替换为其边界或 对象,如果类型参数是无界的。产生的字节码, 因此,只包含普通类、接口和方法

  • 如有必要,插入类型强制转换以保持类型安全

  • 生成桥接方法以在扩展泛型类型中保留多态性
类型擦除可确保不会为参数化类型创建新类 类型;因此,泛型不会产生运行时开销


这是一个非常棒的答案:小心点,你险些偏离了:“为什么泛型不象C++模板那样工作?”当你复制外部资源的单词时,一定要确保你正确引用并链接原始的措辞。
static void f(Object x) {
    x = (Object) (Integer) 1234;
    System.out.println(x);
}