首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于内部类中类型参数的类型声明

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

Stack Overflow用户
提问于 2015-06-25 13:56:36
回答 3查看 1.4K关注 0票数 9

Java阴影类型参数吗?我发现自己很难进行测试,因为Java泛型在运行时没有被具体化。

例如,给定以下代码:

代码语言:javascript
运行
复制
public class NestedGeneric<T> {
    private InnerGeneric<T> innerGenericInstance;

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

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

以下两种语句都可以很好地编译:

代码语言:javascript
运行
复制
NestedGeneric<Integer> test1 = new NestedGeneric<Integer>();
NestedGeneric.InnerGeneric<String> test2  = new NestedGeneric.InnerGeneric<String>();

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-25 14:09:04

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

不是的。外部和内部的静态类之间没有任何关系(比如继承或字段)。您可以创建内部静态类的对象,而不依赖于外部类,如您的示例中所示:

代码语言:javascript
运行
复制
NestedGeneric.InnerGeneric<String> test2  = new NestedGeneric.InnerGeneric<String>();

但是,当您将(内部类的实例)用作字段时,泛型类型是从外部类派生出来的:

代码语言:javascript
运行
复制
private InnerGeneric<T> innerGenericInstance;

innerGenericInstance = new InnerGeneric<T>();

第三个变化是将内部类定义为字段(非静态)

代码语言:javascript
运行
复制
private class InnerGeneric<T> {
    public T innerGenericField;
}

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

正如注释中指出的那样,定义内部静态和外部类以及类型只会使读者(以及稍后的时间点)感到困惑。它应该用不同的泛型来声明,如

代码语言:javascript
运行
复制
public class NestedGeneric<T> {
    private InnerGeneric<T> innerGenericInstance;

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

    NestedGeneric() {
        innerGenericInstance = new InnerGeneric<T>();
    }
}
票数 6
EN

Stack Overflow用户

发布于 2015-06-25 14:17:30

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

当然,您可以拥有更多的类型参数。

代码语言:javascript
运行
复制
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>();会说thad innerGenericInstance是由与OUTER_TYPE相同类型的参数化的。但它们不一定是一样的。与secondInnerGenerics变量的情况一样。

票数 5
EN

Stack Overflow用户

发布于 2015-06-25 14:09:41

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

代码语言:javascript
运行
复制
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();
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31052476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档