为什么封闭类不包含在内部类构造函数的泛型参数中?

时间:2011-01-19 01:12:11

标签: java generics reflection

import java.lang.reflect.*;
import java.util.Arrays;

class Test {
    class Inner {
        public <T> Inner(T arg) {}
    }

    public static void main(String[] args) {
        Constructor<?> constructor = Test.Inner.class.getConstructors( )[0];
        System.out.println(
            "Regular parameters: " +
            Arrays.toString(constructor.getParameterTypes()) +
            "\nGeneric parameters: " +
            Arrays.toString(constructor.getGenericParameterTypes())
        );
    }
}

运行此命令会打印以下内容。

  

常规参数:[类Test,类java.lang.Object]
  通用参数:[T]

我对Java内部类(即非静态)的理解是它们的构造函数隐式地为它们的封闭类提供了一个参数。因此,要获取Inner的实例,可以像这样调用它的构造函数。

Test.Inner foo = new Test().new Inner(new Object());

实际发生的是Test的实例被传递给Inner的构造函数(以及任何其他参数),并将其分配给隐式实例字段。

检查Inner的无效构造函数可以解决这个问题,因为调用getParameterTypes会返回一个数组,其中包含代表ClassTest的{​​{1}}个对象(擦除) Object)。

但是,由于构造函数是通用的,因此调用T会返回仅包含类型变量getGenericParameterTypes的数组。缺少封闭类的隐式参数。

当内部类构造函数声明一个类型变量时,似乎只会发生这种情况。为什么这样做?这是一个错误吗?

1 个答案:

答案 0 :(得分:6)

据报道,这是一个错误:http://bugs.sun.com/view_bug.do?bug_id=5087240