相关疑难解决方法(0)

Java泛型类型擦除:何时以及发生了什么?

在Oracle的网站上读到了Java的类型擦除.

什么时候发生类型擦除?在编译时还是运行时?当班级加载?当类被实例化时?

很多站点(包括上面提到的官方教程)都说在编译时会发生类型擦除.如果在编译时完全删除了类型信息,那么当调用使用泛型的方法而没有类型信息或错误的类型信息时,JDK如何检查类型兼容性?

考虑以下示例:Say class A有一个方法,empty(Box<? extends Number> b).我们编译A.java并获取类文件A.class.

public class A {
    public static void empty(Box<? extends Number> b) {}
}
Run Code Online (Sandbox Code Playgroud)
public class Box<T> {}
Run Code Online (Sandbox Code Playgroud)

现在我们创建另一个类B,该类empty使用非参数化参数(原始类型)调用该方法:empty(new Box()).如果我们编译B.javaA.class在类路径中,javac的是足够聪明,引发警告.所以A.class 一些类型信息存储在其中.

public class B {
    public static void invoke() {
        // java: unchecked method invocation:
        //  method empty in class A is applied to given types
        //  required: Box<? extends java.lang.Number>
        //  found: …
Run Code Online (Sandbox Code Playgroud)

java generics type-erasure

233
推荐指数
6
解决办法
8万
查看次数

在Java中实现ArrayList时键入擦除

我正在阅读关于Java Generics的这篇文章,并且在那里提到了一个ArrayList看起来像这样的构造函数:

class ArrayList<V> {
  private V[] backingArray;
  public ArrayList() {
    backingArray = (V[]) new Object[DEFAULT_SIZE]; 
  }
}
Run Code Online (Sandbox Code Playgroud)

我无法理解编译器的类型擦除和类型检查是如何解释的那样.我得到的一点是type参数转换为Objecttype.

我将它想象成(更换所有VObject),但是这肯定是不对的.

class ArrayList<Object> {
      private Object[] backingArray;
      public ArrayList() {
        backingArray = (Object[]) new Object[DEFAULT_SIZE]; 
      }
}
Run Code Online (Sandbox Code Playgroud)

它究竟是如何转变为Object类型但仍保留类型安全性的V?当我有ArrayList<String>ArrayList<Integer>是否有两种不同类型的每一个?如果没有,在哪里类型的信息StringInteger存储?

java generics constructor arraylist object

12
推荐指数
1
解决办法
755
查看次数

标签 统计

generics ×2

java ×2

arraylist ×1

constructor ×1

object ×1

type-erasure ×1