【问题标题】:Must extending class have the same access level as the class it extends必须扩展类与其扩展的类具有相同的访问级别
【发布时间】:2020-02-10 14:44:54
【问题描述】:

我想扩展一个声明为public class A

的类

看来,如果我想创建一个扩展类 A 的 Class B,我必须使用 public 修饰符声明它。这是正确的吗? 我很乐意解释为什么在扩展课程时我不能使访问级别“更强”?

我在尝试扩展以下类时遇到了这个问题:

android.support.v7.widget.RecyclerView.Adapter<VH extends android.support.v7.widget.RecyclerView.ViewHolder>

当我扩展 VH 时,RecyclerView.ViewHolder 使用一个名为 :MyViewHolder 的类,它具有私有访问权限,我收到一条消息说:'MyViewHolder 在...中有私有访问权限'

【问题讨论】:

  • 不,您可以轻松拥有public class A,但在某个地方也可以拥有private class B extends A。
  • 成员不能拥有比超类更强的访问权限。我猜这个消息,不管它是什么,来自哪里,都与MyViewHolder的使用有关,而不是它的使用方式。

标签: java android inheritance


【解决方案1】:

您的代码可能如下所示:

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    ...
    private class MyViewHolder extends RecyclerView.ViewHolder {
        ...
    }
    ...
}

问题在于MyViewHolder 只能在MyAdapter 的主体中访问,而不是在其声明中。这可以通过将MyViewHolder 包私有化来解决,所以MyAdapter 的声明可以看到它。

来自Java 8 Language Specification:

引用类型的成员(类、接口、字段或方法),或 类类型的构造函数,仅当类型为 可访问,并且声明成员或构造函数允许访问:

  • [对公共、受保护和包访问的描述]
  • 否则,成员或构造函数被声明为私有,并且当且仅当它发生在顶层的主体内时才允许访问 包含成员声明的类(第 7.6 节)或 构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2010-11-15
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多