基于内部类型参数的类型声明 类

Type declaration based on type parameters in inner classes

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?

没有。外部和内部 static class 之间没有关系(如继承或作为字段)。您可以创建一个内部静态 class 的对象,而不依赖于外部 class,就像您的示例中那样:

NestedGeneric.InnerGeneric<String> test2  = new NestedGeneric.InnerGeneric<String>();

但是,当您使用内部 class 的 实例 作为字段时,通用类型派生自外部 class:

private InnerGeneric<T> innerGenericInstance;

innerGenericInstance = new InnerGeneric<T>();

第三种变体是将 内部 class 定义为字段(非静态):

private class InnerGeneric<T> {
    public T innerGenericField;
}

现在将从外部 class 获取类型,因为它是一个成员变量。

正如评论中所指出的那样,用类型定义内部静态和外部 class 只会让 reader(以及你自己在稍后的时间点)感到困惑。它应该用不同的泛型来声明,比如

public class NestedGeneric<T> {
    private InnerGeneric<T> innerGenericInstance;

    private static class InnerGeneric<U> {
        private U innerGenericField;
    }

    NestedGeneric() {
        innerGenericInstance = new InnerGeneric<T>();
    }
}

是,但不使用静态修饰符:

public class NestedGeneric<T> {
    private InnerGeneric<T> innerGenericInstance;

    private class InnerGeneric<T> {
        private T innerGenericField;

        public InnerGeneric(T innerGenericField){
           this.innerGenericField = innerGenericField;
        }

        public T getInnerGenericField(){
           return this.innerGenericField;
        }
    }

    NestedGeneric(T someGenericVariable) {
        innerGenericInstance = new InnerGeneric<T>(someGenericVariable);
        T innerGenericField = innerGenericInstance.innerGenericInstance();
    }
}

这不是阴影。您的代码中只有一个类型参数,即 T 参数。所以内部和外部 T 是相同类型的参数。

你当然可以有更多的类型参数。

public class NestedGeneric<OUTER_TYPE> {

  private static class InnerGeneric<INNER_TYPE> {
    public INNER_TYPE innerGenericField;
  }

  public NestedGeneric() {
    InnerGeneric<OUTER_TYPE> innerGenericInstance = new InnerGeneric<OUTER_TYPE>();

   InnerGeneric<String> secondInnerGenerics = new InnerGeneric<String>();
  } 
}

INNER_TYPEOUTER_TYPE是两个不同类型的参数。行 InnerGeneric<OUTER_TYPE> innerGenericInstance = new InnerGeneric<OUTER_TYPE>(); 会说 innerGenericInstance 的参数化类型与 OUTER_TYPE 相同。但它们不必相同。就像 secondInnerGenerics 变量的情况一样。