内部类成员从封闭类的可访问性
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<Item>
,而您在Iterator<Item>
类中没有任何变量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<Item>
类型的值。
Iterator
类型没有名为 i
的可访问字段。
您的ShuffleIterator
可以。要么转换返回值,要么改变返回类型。
【讨论】:
以上是关于内部类成员从封闭类的可访问性的主要内容,如果未能解决你的问题,请参考以下文章