Java影子类型参数?我发现很难测试自己,因为Java泛型在运行时没有得到认可.
例如,给出这个代码:
public class NestedGeneric<T> { private InnerGeneric<T> innerGenericInstance; private static class InnerGeneric<T> { public T innerGenericField; } NestedGeneric() { innerGenericInstance = new InnerGeneric<T>(); } }
以下语句都编译好:
NestedGeneric<Integer> test1 = new NestedGeneric<Integer>(); NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>();
当NestedGeneric传递一个类型参数及其构造函数时,T是什么?它总是与传递给nestedGeneric的类型参数一样吗?
换句话说,可以将外部类的类型参数传递给内部类通用类型声明?
解决方法
In other words,I suppose the question is,can an outer classes type
parameters be passed to an inner classes generic type declarations?
外部和内部静态类之间没有关系(如继承或者一个字段).您可以像在示例中一样创建内部静态类的对象,而不需要对外部类进行任何依赖:
NestedGeneric.InnerGeneric<String> test2 = new NestedGeneric.InnerGeneric<String>();
但是,当您使用内部类的实例作为字段时,通用类型是从外部类派生的:
private InnerGeneric<T> innerGenericInstance; innerGenericInstance = new InnerGeneric<T>();
第三个变体是将内部类定义为一个字段(非静态):
private class InnerGeneric<T> { public T innerGenericField; }
它将从外部类中获得类型,因为它是一个成员变量.
正如在定义内部静态和外部类与类型只会混淆读者(和你在稍后的时间点).它应该用不同的通用类声明
public class NestedGeneric<T> { private InnerGeneric<T> innerGenericInstance; private static class InnerGeneric<U> { private U innerGenericField; } NestedGeneric() { innerGenericInstance = new InnerGeneric<T>(); } }