繁体   English   中英

Java类型擦除和数组

[英]Java type erasure and Arrays

甲骨文文档说,泛型使用一种技术调用类型擦除在Java中实现,这就是它的工作方式。

  1. 如果类型参数不受限制,则将通用类型中的所有类型参数替换为其边界或对象。 因此,产生的字节码仅包含普通的类,接口和方法。
  2. 必要时插入类型转换,以保持类型安全。
  3. 生成桥接方法以在扩展的泛型类型中保留多态。

因此,如果我有一个通用类,请说如下容器:

class Container<T>{
T initialValue;
List<T> valueList=new ArrayList<T>();
public List<T> getValueList(){
  return valueList;
}

}

经过类型擦除处理后,它的等效类看起来像:

class Container{
    Object initialValue;
    List valueList=new ArrayList();
    public List getValueList(){
      return valueList;
    }

    }

如果这里有错请指正

同样,如果修改上面的类如下

class Container<T>{
    T initialValue;
    List<T> valueList=new ArrayList<T>();
    T[] arrayValue;
    public Container(T[] array){
       arrayValue=array;
     }
    public List<T> getValueList(){
      return valueList;
    }

    }

会不会等于???

class Container{
    Object initialValue;
    List valueList=new ArrayList();
    Object[] arrayValue;
    public Container(Object[] array){
       arrayValue=array;
     }
    public List getValueList(){
      return valueList;
    }

    }

如果是这样,那么我也应该这样: T[] arrayValue=new T[10]; //编译时错误; 因为上面的语句将被转换为

Object[] arrayValue=new Object[10];

需要澄清类型擦除如何在Java中用于数组吗?

您不能创建通用数组。 原因是数组早于Java的泛型,并且数组不使用类型擦除。 因此,例如, Integer[]String[]在运行时确实具有不同的类型。 如果编写new T[] ,则编译器将不知道需要创建哪种数组。

您可以通过执行以下操作来创建伪造的通用数组:

T[] array = (T[]) new Object[10];

但是您必须记住,您实际上创建了一个Object数组,而不是T数组。 在运行时可以在其中放置非T实例,因此只有在数组是您的类的私有字段且永远不会传递给其他对象的情况下才可以这样做,以便您可以精确地控制将哪些对象放置在对象中。阵列。

如果您具有Class<T>实例(所谓的类型令牌),则可以使用Array.newInstance创建具有正确的运行时类型的新数组:

T[] array = (T[]) Array.newInstance(typeToken, 10); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM