根据内部类中的类型参数键入声明

9 java generics 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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

以下两个语句编译正常:

NestedGeneric<Integer> test1 = new NestedGeneric<Integer>();
NestedGeneric.InnerGeneric<String> test2  = new NestedGeneric.InnerGeneric<String>();
Run Code Online (Sandbox Code Playgroud)

NestedGeneric传递一个类型参数并调用其构造函数时,是什么T?它总是与传递给的类型参数相同nestedGeneric吗?

换句话说,可以将外部类类型参数传递给内部类泛型类型声明吗?

6to*_*ton 6

换句话说,我想问题是,是否可以将外部类类型参数传递给内部类泛型类型声明?

不.外部静态类和内部静态类之间没有关系(如继承或字段).您可以创建内部静态类的对象,而不像示例中那样依赖外部类:

NestedGeneric.InnerGeneric<String> test2  = new NestedGeneric.InnerGeneric<String>();
Run Code Online (Sandbox Code Playgroud)

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

private InnerGeneric<T> innerGenericInstance;

innerGenericInstance = new InnerGeneric<T>();
Run Code Online (Sandbox Code Playgroud)

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

private class InnerGeneric<T> {
    public T innerGenericField;
}
Run Code Online (Sandbox Code Playgroud)

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

正如评论中所指出的那样,定义内部静态类和外部类的类型只会让读者感到困惑(以及稍后的时间点).它应该用不同的通用声明

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

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

    NestedGeneric() {
        innerGenericInstance = new InnerGeneric<T>();
    }
}
Run Code Online (Sandbox Code Playgroud)


pla*_*que 5

这不是影子.您的代码中只有一个类型参数,即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>();
  } 
}
Run Code Online (Sandbox Code Playgroud)

INNER_TYPEOUTER_TYPE是两个不同类型的参数.线InnerGeneric<OUTER_TYPE> innerGenericInstance = new InnerGeneric<OUTER_TYPE>();将说thad innerGenericInstance是按照相同的类型进行参数化OUTER_TYPE.但它们不一定是一样的.因为它是secondInnerGenerics变量的情况.