RecyclerView: внутренние классы не могут иметь статических декларации

Я немного смущен, у меня есть настройка recyclerview в соответствии с учебником на сайте google/android, и я получаю следующую ошибку

 Inner classes cannot have static declaration

конечно, у меня есть вложенный статический класс, но так его определил android/google.

  public class ItemsViewAdapter extends RecyclerView.Adapter<ItemsViewAdapter.ViewHolder> {
        ... 
        ...
       public static class ViewHolder extends RecyclerView.ViewHolder {
           ...
       }

почему я получаю эту ошибку, я слышу, что лучше использовать вложенный класс как статический, поэтому вы не тратите ссылку, но текущая версия Android studio жалуется

любые идеи ?

спасибо

2 ответов


прямо на ваши вопросы:

  1. внутренние классы не могут иметь статических декларации

    это совершенно верно. Это не ошибка, и сообщение об ошибке даже не вводит в заблуждение.

  2. Я слышу, что лучше использовать вложенный класс как статический, поэтому вы не тратите ссылку

    вы абсолютно правы.

  3. раствор для ты:

    создайте новый класс (файл) в своем проекте для ItemsViewAdapter и такой ошибки не будет.


Общие Обсуждения

Java и Android оба поддерживают, что вы можете объявить static внутренние классы/члены/функции но этот класс должен быть родительским классом. Вы не можете сделать это внутри внутреннего класса.

И. Е., class Main может быть static class Adapter но если Adapter класс внутренняя класс Main не статический, то он не может иметь свой собственный статический внутренний класс/член.

Что Вы Можете Иметь?

class Main 
    static class Adapter
        static class Holder

или

class Adapter
    static class Holder

если вы хотите объявить любого члена класса как static тогда непосредственный родительский класс должен быть основным классом верхнего уровня в этом файле.

почему?

цитирую другой ответ, это потому, что внутренний класс имеет неявно связан с экземпляром из своего внешнего класса он не может определить какие-либо статические методы сам. Поскольку статический вложенный класс не может напрямую ссылаться на переменные экземпляра или методы, определенные в его заключительном классе, он может использовать их только через ссылку на объект, безопасно объявлять статические методы в статическом вложенном классе.

дальнейшее чтение по теме

1 http://www.geeksforgeeks.org/inner-class-java/

2 http://www.javaworld.com/article/2077372/learn-java/static-class-declarations.html

3 http://viralpatel.net/blogs/inner-classes-in-java/


вы также можете просто реализовать ItemViewAdapter как статический класс

public static class ItemsViewAdapter extends RecyclerView.Adapter<ItemsViewAdapter.ViewHolder> {
    ... 
    ...
   public static class ViewHolder extends RecyclerView.ViewHolder {
       ...
   }

Это должно позаботиться об ошибке