【发布时间】:2023-04-07 11:34:01
【问题描述】:
【问题讨论】:
-
看here
标签: c# java types type-inference type-erasure
【问题讨论】:
标签: c# java types type-inference type-erasure
类型擦除存在很多问题。它带回了不好的回忆。我从 1.6 开始就没有使用过 Java,所以这可能已经过时了,但我记得一些事情:
class c implements IComparable<MyClass>, IComparable<MyOtherClass> 是不可能的。
List<T1>、List<T2> 等等。例如,Java -- How to deal with type erasure in constructors?
【讨论】:
这是一个只有在运行时保留类型信息才可能实现的示例:
public string DoSomething<T>()
{
return typeof(T).Name;
}
你可以在 Java 中获得的最接近的是:
public <T> string DoSomething(Class<T> theClass)
{
return theClass.getName();
}
【讨论】:
由于类型擦除而在 Java 中发生的事情是创建称为“桥接方法”的合成方法。
这通常发生在 Java 尝试编译扩展参数化类或实现参数化接口的类或接口时。在这种情况下,Java 编译器可能需要创建一个合成方法(桥接方法)作为类型擦除过程的一部分,该过程出现在堆栈跟踪中。
编译器这样做是为了在类型擦除过程之后保留泛型类型的多态性。
Java 的文档有an example。
【讨论】: