我在理解范围如何影响我的代码时遇到了一些麻烦。我似乎无法访问公共类的公共属性。我创建了一个自定义类ArtistPacket,该类具有要发送到我的自定义适配器(ArtistListAdapter)的信息块。自定义类如下:public class ArtistPacket{ public String name; public int id; public ArtistPacket(String name, int id){ this.name = name; this.id = id; }}它在MainActivityFragment中定义,在这里我创建一个使用这些ArtistListAdapter的ArtistPackets。public class MainActivityFragment extends Fragment{...ArtistListAdapter<ArtistPacket> artistListAdapter = new ArtistListAdapter<ArtistPacket>(getActivity(), artistData);...然后定义ArtistListAdapter和getViewprivate class ArtistListAdapter<ArtistPacket> extends ArrayAdapter<ArtistPacket>{ public ArtistListAdapter(Context context,ArrayList<ArtistPacket> artists){ super(getActivity(),0,artists); } @Override public View getView(int position, View view, ViewGroup parent) {...在getView中,我需要name对象中的id和ArtistPacket(在本例中为artist)。所以我尝试打电话ArtistPacket artist = getItem(position);textItemContent.setText((CharSequence) artist.name);但是我得到一个编译错误。在调试器中,似乎好像有完整的对象正在通过-似乎适配器不访问name或id属性。我得到的错误是:Error:(98, 58) error: cannot find symbol variable namewhere ArtistPacket is a type-variable:ArtistPacket extends Object declared in class MainActivityFragment.ArtistListAdapter我的实现范围存在问题吗?如果在调试器中可以清楚地看到ArtistPacket对象的内容,为什么适配器看不到它?这是完整的getView: @Override public View getView(int position, View view, ViewGroup parent) { // Find the artist packet at a given position ArtistPacket artist = getItem(position); if (view == null) { view = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false); } TextView textItemContent = (TextView) view.findViewById(R.id.list_item_content); ImageView imageViewContent = (ImageView) view.findViewById(R.id.list_item_image); textItemContent.setText((CharSequence) artist.name); imageViewContent.setImageResource(artist.id); return view; } 最佳答案 微妙而重要的答案。下面的类定义:private class ArtistListAdapter<ArtistPacket> extends ArrayAdapter<ArtistPacket>可以分解以更好地理解。ArtistListAdapter<ArtistPacket>表示ArtistListAdapter将类型参数定义为ArtistPacket。这意味着任何时候引用ArtistPacket都在引用此类型声明-而不是上面定义的类。另一方面,extends ArrayAdapter<ArtistPacket>表示ArtistListAdapter扩展了一个ArrayAdapter,该ArrayAdapter使用上述ArtistPacket类。换句话说,第一个与定义的类型有关,而第二个与已使用的类型有关。因此,我使用了以下声明:private class ArtistListAdapter extends ArrayAdapter<ArtistPacket>这意味着ArtistListAdapter将使用类型ArtistPacket扩展-不会通过定义其自身的本地ArtistPacket类型而混淆情况。Source
08-17 10:27