Реализованный универсальный класс, получающий активность.эта ошибка

#java #android #generics

#java #Android #общие

Вопрос:

Я реализовал универсальный класс, я определил тип T для интерфейса Integer , я получаю ошибку при вызове Activity.this и создании экземпляра адаптера.

скриншот ошибки

введите описание изображения здесь

Код

 public class TestActivity extends AppCompatActivity implements RecyclerViewAdapter.OnRecyclerViewItemClickListener<Integer> {

    private RecyclerView testRecycleView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        testRecycleView = findViewById(R.id.test_recycleview);

        ArrayList<Pet> pet = new ArrayList<>();
        pet.add(new Pet("a","nothing"));
        pet.add(new Pet("b","nothing"));
        pet.add(new Pet("c","nothing"));
        pet.add(new Pet("d","nothing"));
        pet.add(new Pet("e","nothing"));

        RecyclerViewAdapter<Pet> adapter = new RecyclerViewAdapter<Pet>(pet, this, R.layout.test_pet_row);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
        testRecycleView.setLayoutManager(layoutManager);

        testRecycleView.setAdapter(adapter);

    }

    @Override
    public void onItemClick(Integer position) {
        Toast.makeText(this, "clicked "  position, Toast.LENGTH_SHORT).show();
    }
}
  

Универсальный класс

 public class RecyclerViewAdapter<T> extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private ArrayList<T> mDataset;
    private OnRecyclerViewItemClickListener<T> onRecyclerViewItemClickListener;
    private int layoutId;

    public RecyclerViewAdapter(ArrayList<T> measurements, OnRecyclerViewItemClickListener<T> onRecyclerViewItemClickListener, int layoutId) {
        this.onRecyclerViewItemClickListener = onRecyclerViewItemClickListener;
        this.mDataset = measurements;
        this.layoutId = layoutId;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerViewRow<T> row = (RecyclerViewRow<T>) LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
        ViewHolder vh = new ViewHolder(row);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.mRow.showData(mDataset.get(position));
        ((View) holder.mRow).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (onRecyclerViewItemClickListener != null) {
                    onRecyclerViewItemClickListener.onItemClick(mDataset.get(position));
                }
            }
        });

    }

    @Override
    public int getItemCount() {
        return mDataset.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public RecyclerViewRow mRow;

        public ViewHolder(RecyclerViewRow itemView) {
            super((View) itemView);
            mRow = itemView;
        }
    }

    public interface RecyclerViewRow<T> {
        void showData(T item);
    }

    public interface OnRecyclerViewItemClickListener<T> {
        void onItemClick(T position);
    }

}
  

Ответ №1:

Не должно ли это быть

 implements RecyclerViewAdapter.OnRecyclerViewItemClickListener<Pet>
  

вместо

 implements RecyclerViewAdapter.OnRecyclerViewItemClickListener<Integer> 
  

потому что у вас есть

 ArrayList<T> measurements, OnRecyclerViewItemClickListener<T> onRecyclerViewItemClickListener
  

таким образом, оба используют «T»

новый RecyclerViewAdapter устанавливает T в значение «Pet», поэтому T не может быть «целым числом» одновременно

Комментарии:

1. спасибо @JavaMan за ваш ответ, но, похоже, это не проблема. Я поделился кодом общего класса. Теперь вы можете увидеть конструктор. может быть, это поможет 🙂

2. В нем говорится, что требуется тип RecyclerViewAdapter . OnRecyclerViewItemClickListener, но предоставил TestActivity. Эта ошибка возникает, когда я определяю тип в Integer, когда оставлено пустым, не вызывает проблем. Но мне нужно явно определить, что это целое число. Я также обновил скриншот ошибки.

3. Разве это не должно быть ‘implements RecyclerViewAdapter . OnRecyclerViewItemClickListener<Pet>’ вместо’реализует RecyclerViewAdapter . OnRecyclerViewItemClickListener<Целое число>’ поскольку у вас есть ‘ArrayList<T> измерения, OnRecyclerViewItemClickListener<T> onRecyclerViewItemClickListener’ поэтому оба используют «T»; новый RecyclerViewAdapter<Pet> устанавливает T в «Pet»

4. да, на самом деле, я этого не осознавал 🙂 можете ли вы обновить свой ответ, я приму. Большое вам спасибо.