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是什么?它总是与传递给nestedGeneric的类型参数相同吗?
换句话说,可以将外部类类型参数传递给内部类泛型类型声明吗?
发布于 2015-06-25 14:09:04
换句话说,我想问题是,外部类类型参数能否传递给内部类--泛型类型声明?
不是的。外部和内部的静态类之间没有任何关系(比如继承或字段)。您可以创建内部静态类的对象,而不依赖于外部类,如您的示例中所示:
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>();
    }
}发布于 2015-06-25 14:17:30
这不是阴影。代码中只有一个类型参数,即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_TYPE和OUTER_TYPE是两个不同的类型参数。行InnerGeneric<OUTER_TYPE>  innerGenericInstance = new InnerGeneric<OUTER_TYPE>();会说thad innerGenericInstance是由与OUTER_TYPE相同类型的参数化的。但它们不一定是一样的。与secondInnerGenerics变量的情况一样。
发布于 2015-06-25 14:09:41
是的,但不使用静态修饰符:
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();
    }
}https://stackoverflow.com/questions/31052476
复制相似问题