【问题标题】:use inner class as a generic parameter to HashMap使用内部类作为 HashMap 的泛型参数
【发布时间】:2014-12-10 21:13:31
【问题描述】:

遇到了一点..棘手的问题。在网上看到很多关于这个的话题,但没有准确地找到转向的地方 这里的问题是在文件 A 中定义了一个类 A。在同一个文件 A 中定义了一个内部类 B。

public class A implements Serializable{
... some code and fields.. etc
   class B implements Serializable{
   }
 ...
}

在我的项目中包含的模块中定义的所有内容作为 jar 文件.. 在一个主项目中,我需要定义一个 HashMap 持有 B 类型的对象。所以,最终目标是这样的......

HashMap<String, B> map = new HashMap<String, B>()

我知道无法从我当前所在的位置访问 B,因此我正在尝试找到合适的语法来执行此操作。
试过这样: HashMap&lt;String, A.B&gt; map = new HashMap&lt;String, A.B&gt;()

但它编译器抱怨 B 不可见。
任何人都可以帮忙吗?这是一个现实的问题吗?

【问题讨论】:

  • 公开 B 类?
  • 谢谢。做到了。 !!

标签: java generics inner-classes


【解决方案1】:

如果你真的需要在当前不可见的地方使用B,你可能应该让它可见并声明它public

public class A implements Serializable {
    // ...
    public class B implements Serializable {
        // ...
    }
}

【讨论】:

    【解决方案2】:

    您可以使 B 成为 A 的成员并使用 getter 方法返回 B。理想情况下,您希望实例成员保持私有并使用 getter 方法来访问它们。比如

    public class A {
     private B b;
    
     public A() {
      this.b = new B();
     }
    
     public B getB() {
      return this.B;
     }
    
     class B {
    
     }
    
    }
    
    B b = new A().getB();
    

    这就是棘手的地方;每个 java 文件只能声明一个公共类,除非它是一个内部类。第二个将是默认包。如果你在同一个包中,那么你可以声明一个类型为 B 的变量。否则,你为 B 创建一个单独的类文件。

    【讨论】:

    • 谢谢,但这并不能解决使用 B 作为 HashMap 元素的通用参数的问题。@JeanLogeart 的回答成功了。
    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多