在Java中,可以在兄弟姐妹具有不同类型参数的情况下调用兄弟姐妹类的protected方法吗?

时间:2019-09-25 15:17:52

标签: generics access protected siblings

给出以下父类:

public class AbstractParent<T> {
    abstract protected void doSomething();
}

和以下子类:

public class DelegatingChildClass<T,U> extends AbstractParent<T> {
   AbstractParent<U> delegate;
   public DelegatingChildClass(AbstractParent<U> delegate) {
      this.delegate = delegate;
   }

   @Override
   protected void doSomething() {
      delegate.doSomething();//<--- Problem line
   }
}

我对受保护方法的理解是访问仅限于:

  • 与声明类在同一包中的类
  • 扩展声明类的类

由于DelegatingChildClass扩展了AbstractParent,所以我期望可以访问委托的doSomething()方法。但是,编译器抱怨它具有受保护的访问。这是编译器错误吗?还是我对受保护的访问修饰符应该如何工作有误解?

1 个答案:

答案 0 :(得分:0)

“扩展声明类的类”意味着您可以沿着该对象的扩展层次结构访问同一对象(this)的超类中的方法。类型DelegatingChildClass<T,U>的对象也是类型AbstractParent<T>的对象,因此在DelegatingChildClass<T,U>的代码中,您可以对同一对象使用AbstractParent<T>的方法。这将允许super.doSomething(),但是在这里没有意义,因为super.doSomething()abstract

使用delegate不可能在这里调用doSomething(),因为类型DelegatingChildClass<T,U>的对象不会在此处扩展变量delegate中的对象。这种用法称为组合,而不是扩展。