【问题标题】:Does java implement type erasure in user defined generic classes too?java是否也在用户定义的泛型类中实现类型擦除?
【发布时间】:2009-06-10 11:46:17
【问题描述】:

假设我有一堂课 我想在某处将其用作泛型类型:

class MyList<T>
{
    T[] list=T[10];

    public void add(T element)
    { 
        list[0]=element;
    }
}

编译后,它会像泛型集合那样删除其类型信息吗?

我不需要在任何地方使用此代码,所以请不要专注于查找错误。我只是想通过这段代码问一个一般性的问题,编译后将列出实例变量类型为 Object 类。

【问题讨论】:

  • 好吧,在这种情况下它不会,因为该代码无法编译:您无法创建泛型数组,并且类的参数化与其变量的参数化不匹配
  • 事实上,在这段代码中根本没有创建通用数组......我没有看到任何“新”:--)
  • T 隐式扩展了 Object,因此即使在编译期间,T 也只是一个带有一些编译时检查的 Object。

标签: java generics compilation type-erasure


【解决方案1】:

Yes,当然。

还要注意:

  1. 类的类型参数必须与其主体中的泛型类型匹配
  2. You can't create a generic array,但你可以声明它。这背后的基本原理是allowing construction of generic arrays would make java not type-safe anymore。请改用数组列表。

【讨论】:

  • 我经常对为什么有些事情被否决感到困惑。向我 +1,因为您的回答准确且有用。
  • 第 2 点是错误的:数组可以是通用的;你不能创建一个通用数组。参见嵌套类 Arrays.ArrayList 的代码... 下面应该编译(
    应该是换行符):
    public class Test {
    private T[] list;
    public Test(T[] aList) {
    list = aList;
    }
    }
【解决方案2】:

我什至不确定它会编译。它至少应该提供一个警告。

这里的问题是数组是协变的。泛型不是。这意味着泛型在运行时不会保留类型信息。数组可以。

是的,这适用于所有泛型类型,包括用户定义的。

【讨论】:

  • 感谢代码只是 fr 示例。我只是想知道它的 case fr 是否也是用户定义的。
猜你喜欢
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2012-12-07
  • 1970-01-01
  • 2017-09-24
相关资源
最近更新 更多