可能重复:
C# 与 Java 泛型
Java
在运行时保留类型信息的同时使用类型擦除C#
,语言的行为与这种设计有什么实际区别?
可能重复:
C# 与 Java 泛型
Java
在运行时保留类型信息的同时使用类型擦除C#
,语言的行为与这种设计有什么实际区别?
类型擦除存在很多问题。它带回了不好的回忆。我从 1.6 开始就没有使用过 Java,所以这可能已经过时了,但我记得一些事情:
class c implements IComparable<MyClass>, IComparable<MyOtherClass>
是不可能的。
List<T1>
,List<T2>
等。例如,Java——如何处理构造函数中的类型擦除?这是一个只有在运行时保留类型信息时才可能发生的事情的示例:
public string DoSomething<T>()
{
return typeof(T).Name;
}
您可以在 Java 中获得的最接近的是:
public <T> string DoSomething(Class<T> theClass)
{
return theClass.getName();
}
由于类型擦除而在 Java 中发生的事情是创建称为“桥接方法”的合成方法。
这通常发生在 Java 尝试编译扩展参数化类或实现参数化接口的类或接口时。在这种情况下,Java 编译器可能需要创建一个合成方法(桥接方法)作为类型擦除过程的一部分,该过程出现在堆栈跟踪中。
编译器这样做是为了在类型擦除过程之后保留泛型类型的多态性。
Java 的文档有一个例子。