5

可能重复:
C# 与 Java 泛型

Java在运行时保留类型信息的同时使用类型擦除C#,语言的行为与这种设计有什么实际区别?

4

3 回答 3

5

类型擦除存在很多问题。它带回了不好的回忆。我从 1.6 开始就没有使用过 Java,所以这可能已经过时了,但我记得一些事情:

  1. 你不能创建一个新的 T (或者做任何需要知道 T 实际是什么类型的事情)
  2. 通用列表无法创建 T 数组
  3. 您不能在 Java 的泛型中使用 int、float 等
    1. 这会影响性能和内存,因为您始终必须使用堆版本(整数等)
  4. 你不能用两个不同的 T 实现一个通用接口,例如class c implements IComparable<MyClass>, IComparable<MyOtherClass>是不可能的。
    1. 更实际地,您不能重载具有不同泛型类型的方法,例如通过接收List<T1>,List<T2>等。例如,Java——如何处理构造函数中的类型擦除?
  5. 一切都是通过铸造和拳击来完成的
于 2012-10-20T15:30:38.083 回答
2

这是一个只有在运行时保留类型信息时才可能发生的事情的示例:

public string DoSomething<T>()
{
    return typeof(T).Name;
}

您可以在 Java 中获得的最接近的是:

public <T> string DoSomething(Class<T> theClass)
{
    return theClass.getName();
}
于 2012-10-20T15:22:49.350 回答
1

由于类型擦除而在 Java 中发生的事情是创建称为“桥接方法”的合成方法。

这通常发生在 Java 尝试编译扩展参数化类或实现参数化接口的类或接口时。在这种情况下,Java 编译器可能需要创建一个合成方法(桥接方法)作为类型擦除过程的一部分,该过程出现在堆栈跟踪中。

编译器这样做是为了在类型擦除过程之后保留泛型类型的多态性。

Java 的文档有一个例子

于 2012-10-20T15:29:55.377 回答