【问题标题】:In Java is it possible to call a sibling class's protected method where the sibling has different type parameters?在Java中是否可以调用兄弟类的受保护方法,其中兄弟具有不同的类型参数?
【发布时间】:2019-09-25 15:17:52
【问题描述】:

给定以下父类:

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 protected siblings


    【解决方案1】:

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

    对于delegate,这里不能调用doSomething(),因为DelegatingChildClass&lt;T,U&gt; 类型的对象不会扩展变量delegate 中的对象。这种用法称为组合,而不是扩展。

    【讨论】:

    • 听起来您是在说子类的实例只能访问在当前实例上调用父类中声明的受保护方法。如果这就是你所说的,那你就错了。
    • 显然我弄错了。我正在考虑从其他实例访问私有方法和变量,但它们都在同一个声明类中。 JLS 的相关部分如下所示: * 对象的受保护成员/构造函数可以从包外部访问,在该包中,仅由负责实现该对象的代码声明它。 (即仅在同一个子类中)由于某种原因,当我问这个问题时,我找不到语言规范的正确部分。我接受了你的回答。
    猜你喜欢
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2021-02-25
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多