【发布时间】:2015-07-12 12:02:36
【问题描述】:
我的代码如下所示:
public class A<T extends A> {
private T one() { return (T) this;}
protected T two() { return (T) this;}
protected void three() { two().one(); }
}
而 IntelliJ 告诉我“one() 在 A 中具有私有访问权限”,但是,为什么我不能调用同一类的私有成员?
【问题讨论】:
-
T是一些扩展A但可能不是A的类 -
From the horse's mouth。类的子类无法访问其父类的私有方法,因为……这就是语言的设计方式。
-
“一个班级的孩子不能访问他们父母的私有方法” 但我尝试在父母班级访问他们!如果我写
class A { public void method(A obj) {那么我可以访问 A 类的私有成员,但传递的 obj 可以是这个类的子级。那么为什么在这种情况下它不起作用呢? -
这有点不相关,但请注意,即使这确实有效,您也不能在一行中链接超过 2 个。为此,您应该将其声明为
A<T extends A<T>>,这将允许无限链接。 -
这是个好问题。正如@Peter Lawrey 所说,
T扩展A但可能不是A- 但如果T扩展A那么T的实例将有一个方法one,只能定义在课堂上A。我明白为什么从一个对其定义没有保证的范围内访问一个成员是不好的,但是这里的调用范围有一个有保证的具体定义——A的扩展不能修改one的行为,可以是吗?
标签: java generics inheritance casting