【问题标题】: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

标签: java iterator inner-classes access-modifiers


【解决方案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 可以。要么转换返回值,要么改变返回类型。

【讨论】:

    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多