在Java中,如果同级具有不同的类型参数,可以调用同级类的受保护方法吗?

问题描述 投票:0回答:1

给出以下父类:

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()方法。但是,编译器抱怨它具有受保护的访问。这是编译器错误吗?还是对受保护的访问修饰符应该如何工作有错误的理解?

generics access protected siblings
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.