内部类成员从封闭类的可访问性

Posted

技术标签:

【中文标题】内部类成员从封闭类的可访问性【英文标题】:Accessibility of inner class members from enclosing class 【发布时间】:2015-04-16 09:33:17 【问题描述】:

我认为内部类的成员,即使声明为私有,也可以从其封闭类访问。但是我遇到了以下代码结构的编译时错误。我的***类实现了 Iterable 接口。 Iterator 在内部类中实现。当通过 iterator() 方法获得内部类的实例时,我无法使用该实例访问数据字段。

public class RandomQueue<Item> implements Iteralbe<Item>

     public RandomQueue()             
     public Iterator<Item> iterator()        // iterator() method
      
         return new ShuffleIterator();
     
     // inner class implementing iterator
     private class ShuffleIterator implements Iterator<Item>  
     
         private int i;      // private data field in inner class.
         .......
         public boolean hasNext()  ...
         public Item next()   ...
         public void remove()  ... 
     

     public void doSomething()
     
         // Compile time error. "i cannot be resolved or is not a field"
         int j = iterator().i;     
     

有什么建议吗?

【问题讨论】:

Iterator 类型没有名为 i 的可访问字段。您认为您使用iterator().i 访问的是什么? 我希望实现迭代器,以便它遍历一个数组并在这样做时对其进行洗牌。所以除了接口抽象方法外,我还添加了一些数据字段和方法。 iterator().someDataField 需要返回洗牌操作的结果。 明确一点:这不是关于内部类,也不是关于private 【参考方案1】:

因为您的方法iterator() 的返回类型是Iterator&lt;Item&gt;,而您在Iterator&lt;Item&gt; 类中没有任何变量i

如果你的方法是:

 public ShuffleIterator iterator()        // iterator() method
      
         return new ShuffleIterator();
     

那么你不会有任何编译错误,因为i 存在于ShuffleIterator 类中。

【讨论】:

由于某种原因,如果我尝试对此(转载 x3)进行投票,我会收到错误(没有更多详细信息),但如果我尝试对其他答案进行投票,则不会。 只是返回 ShuffleIterator 似乎不是一个好主意,因为那样你就暴露了私有成员类。 @immibis 真的吗?我不知道为什么但没问题:) @Radiodef 是的,你是对的,但我想更新以使用投射,然后我看到了 Sotirios Delimanolis 的答案,其中包括投射,所以如果我将它添加到我的答案中,那么它只是一个副本: ) @Tarik 无论如何,每个人都会得到一个 ShuffleIterator 的实例。【参考方案2】:

你的方法iterator

 public Iterator<Item> iterator()        // iterator() method

被声明返回一个Iterator&lt;Item&gt;类型的值。

Iterator 类型没有名为 i 的可访问字段。

您的ShuffleIterator 可以。要么转换返回值,要么改变返回类型。

【讨论】:

以上是关于内部类成员从封闭类的可访问性的主要内容,如果未能解决你的问题,请参考以下文章

与接口相关的访问修饰符

C++ 在派生类中使用using声明改变基类成员的可访问性

Swig:如何将生成的 C# 类的可访问性从“公共类”更改为“内部类”

急急急!!!!C# 中关于子类访问基类成员的可访问性

Java的静态成员类

与抽象类的可访问性不一致