当前位置: 首页 > 知识库问答 >
问题:

为什么在外类的括号内编写内部私有类会出错?

苏野
2023-03-14

我试图在外类声明的括号(泛型)中插入一个私有类,并得到下一个错误:“com.example.gridrecyclerview.RecycleViewAdapter。VieHolder在com.example.gridrecyclerview.RecyclViewAdapter中有私有访问权限”

内部类更改为公共类时,一切正常。谁能给我解释一下这个问题吗。附件代码:

    package com.example.gridrecyclerview;

import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;
import java.util.Random;

public class RecyclerViewAdapter extends RecyclerView.Adapter <RecyclerViewAdapter.ViewHolder> {
    Context context;
    List<ModelItem> modelItemList;

    public RecyclerViewAdapter(Context context, List<ModelItem> modelItemList)
    {
        this.context = context;
        this.modelItemList = modelItemList;
    }

    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(context).inflate(R.layout.rc_item,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position)
    {
        Log.e("onBindViewHolder ","onBindViewHolder");
        ModelItem modelItem = modelItemList.get(position);
        holder.firstNameTextView.setText(modelItem.getFirstName());
        holder.secondNameText.setText(modelItem.getLastName());
    }

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

    private class ViewHolder extends RecyclerView.ViewHolder
    {

        TextView firstNameTextView;
        TextView secondNameText;
        public ViewHolder(@NonNull View itemView)
        {
            super(itemView);
            firstNameTextView = itemView.findViewById(R.id.first_name);
            secondNameText = itemView.findViewById(R.id.second_name);
        }
    }
}

共有3个答案

邴俊民
2023-03-14

根据Java Spec Page-164中的可访问性规则,声明的私有成员只能在顶级类的主体中访问。我希望课程的主体不是指它的定义。

**否则,该成员或构造函数被声明为私有,并且只有当且仅当它发生在包含该成员或构造函数声明的顶级类(§7.6)的主体内时,才允许访问**

茹轩昂
2023-03-14

您不能这样做,因为您正在将私有类传递给“RecyclerView.Adapter”类。换句话说,ViewHolder类仅在RecycleServiceAdapter类中可用。

PS:您可以将这个类创建为一个新类,然后将其传递给“RecyclerView.Adapter”类或将其更改为公共范围。

金高飞
2023-03-14

要回答这个问题,您应该知道在Java中使用泛型时幕后发生了什么,泛型在编译时被检查,并且在运行时没有泛型类型,这称为类型擦除,当您编译程序时,所有泛型都是它们特定类型的种姓。想象一下您的RecyclView。Adapter类如下:

public class Adapter<T> {
    T view;

    public T getView() {
        return view;
    }

    public void setView(T view) {
        this.view = view;
    }
}

想象一下,您像以前一样定义了RecycleServiceAdapter类:

现在让我们从两个角度来讨论这个问题:

  1. 程序员

作为程序员,想象一下在另一个类中的某个地方,您创建了一个RecycleServiceAdapter类的实例,如下所示,并对该对象调用getView()

RecyclerViewAdapter recycler = RecyclerViewAdapter();
? object =  recycler.getView()

你放在这里而不是什么类型的对象?显然你不能放RecyclViewAdapter。ViewHolder因为它对于RecyclViewAdapter是私有的,您不能在其他地方使用它。

现在让我们从编译器的角度来考虑这个问题:

编译泛型时,编译器使用擦除,并将代码编译为如下内容:

RecyclerViewAdapter recycler = RecyclerViewAdapter();
? object =  (RecyclerViewAdapter.ViewHolder)recycler.getView();

在这里,您可以看到编译器在编译时((RecycleServiceAdapter.ViewHolder)recycler)强制转换对象的类型。getView())。但编译器有可能在这里做这样的事情吗?

当然不是因为RecycleServiceAdapter。ViewHolderRecycleServiceAdapter类的私有代码,而此代码是在另一个类中编写的。

 类似资料:
  • 问题内容: 我观察到外部类可以访问内部类的私有实例变量。这怎么可能?这是演示相同代码的示例代码: 为什么允许这种行为? 问题答案: 内部类只是一种将真正属于原始外部类的功能完全分开的方法。当你有两个要求时,可以使用它们: 如果是在单独的类中实现的,那么外部类中的某些功能将最为清晰。 即使在单独的类中,该功能也与外部类的工作方式紧密相关。 鉴于这些要求,内部类可以完全访问其外部类。由于它们基本上是外

  • 这可能是一个愚蠢的问题,但是我很惊讶地看到,在外部类中不允许使用私有内部类作为泛型类型。 如果我使内部类受到保护,它编译得很好。 此外,我还必须精确而不仅仅是,否则找不到内部类。这看起来也有点奇怪。 为什么内心不能是私密的?为什么它被允许受到保护? 错误是: 我使用的是JavaSE17,但我认为它并没有太大用处。

  • 为什么我不能这样做/是否有解决方法来实现这一点: 这两个编译错误是 > On

  • 为什么这段代码不起作用 在这段代码工作的时候? 在第一段代码中,当我试图通过内部类“a”的对象引用内部类“a”的实例变量“x”时,我得到一个错误,说我是在静态上下文中使用内部类。在其他方法中执行相同操作时没有错误。

  • 问题内容: 因此,我们大多数人都知道 如何 从内部类访问外部类。用这些词进行搜索会给出关于该主题的大量回答问题。但是我想知道的是为什么语法是这样。 例: 为什么呢?看起来是A类的静态字段,但是… 感到困惑 如果这是重复的话,请原谅我。就像我说的那样,用这些词进行搜索会给出操作答案。 问题答案: 为什么这样做呢?真的,只是因为它的方式。它行之有效,从某种意义上讲,并且不需要花哨的语法来完成这项工作。

  • 问题内容: 如果仍然无法在包含类的外部访问它,则用Java声明一个私有内部类的成员的原因是什么?可以吗 问题答案: 如果该类没有扩展任何类或实现任何接口,那么我认为这是无稽之谈,因为没有其他类可以访问它的任何实例。 但是,如果它扩展或实现了任何其他非私有类或接口,则是有意义的。一个例子: