Расширяемый класс должен иметь тот же уровень доступа, что и расширяемый класс - PullRequest
0 голосов
/ 10 февраля 2020

Я хочу расширить класс, который объявлен publi c class A

Кажется, что если я хочу создать Class B , который расширяет класс О, я должен объявить это с модификатором publi c. Это правильно? Я буду рад получить объяснение, почему я не могу сделать уровень доступа «более сильным» при расширении класса?

Я сталкиваюсь с этой проблемой, когда пытался расширить следующий класс:

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

и когда я расширил VH , RecyclerView.ViewHolder с помощью класс с именем: MyViewHolder , который имеет частный доступ. Я получил сообщение: 'MyViewHolder имеет частный доступ в ...'

1 Ответ

0 голосов
/ 10 февраля 2020

Ваш код, вероятно, выглядит примерно так:

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

Проблема в том, что MyViewHolder доступен только в теле MyAdapter, а не в его объявлении. Это можно обойти, сделав MyViewHolder package-private, так что объявление MyAdapter может увидеть его.

Из спецификации языка Java 8 :

Элемент (класс, интерфейс, поле или метод) ссылочного типа или конструктор типа класса доступен только в том случае, если тип доступен, а член или конструктор объявлен для разрешения доступа:

  • [описания publi c, защищенного доступа и доступа к пакету]
  • В противном случае член или конструктор объявляется закрытым, и доступ разрешается, если и только если он происходит в пределах тело класса верхнего уровня (§7.6), которое содержит объявление члена или конструктора.
...