Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建泛型类型适配器类无效_Java_Android_Generics - Fatal编程技术网

Java 创建泛型类型适配器类无效

Java 创建泛型类型适配器类无效,java,android,generics,Java,Android,Generics,我有3个不同的ArrayLists,每个都有来自特定对象的数据:Type\u a、Type\u B和Type\u C。每个字段都有一个字段私有字符串名称,因此我将该字段移动到类型_General,并使用所有3种类型来扩展General类型 我想为每个项目列表使用一个适配器,我想如果它们都扩展相同的类型(type\u General),并且适配器使用一个list,我就不必创建3个不同的适配器,每种类型一个 但有趣的是,当我尝试为类型A实例化一个时,我的IDE(Android Studio)中出现了

我有3个不同的
ArrayList
s,每个都有来自特定对象的数据:
Type\u a
Type\u B
Type\u C
。每个字段都有一个字段
私有字符串名称
,因此我将该字段移动到
类型_General
,并使用所有3种类型来扩展General类型

我想为每个项目列表使用一个适配器,我想如果它们都扩展相同的类型(
type\u General
),并且适配器使用一个
list
,我就不必创建3个不同的适配器,每种类型一个

但有趣的是,当我尝试为
类型A
实例化一个时,我的IDE(
Android Studio
)中出现了一个红线错误,因为它需要一个
列表,而我通过了
List

我的适配器类的代码:

class SuggestionsAdapter extends RecyclerView.Adapter<SuggestionsAdapter.ViewHolder> {

private List<Type_General> mDataset;
private EditProfileFragment.SuggestionsEditTextEnum editTextEnum;
private EditText editText;
private RecyclerView recyclerView;

class ViewHolder extends RecyclerView.ViewHolder {
    TextView mTextView;
    ViewHolder(TextView v) {
        super(v);
        mTextView = v;
    }
}

SuggestionsAdapter(List<Type_General> myDataset, EditProfileFragment.SuggestionsEditTextEnum editTextEnum,
                   EditText editText, RecyclerView recyclerView) {
    mDataset = myDataset;
    this.editTextEnum = editTextEnum;
    this.editText = editText;
    this.recyclerView = recyclerView;
}

@Override
public SuggestionsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.textview_with_rounded_corners, parent, false);

    return new ViewHolder((TextView) v);
}

@Override
public void onBindViewHolder(final SuggestionsAdapter.ViewHolder holder, final int position) {
    holder.mTextView.setText(capitalizeFirstLetter(mDataset.get(position).getName()));
    holder.mTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (editTextEnum) {
                case Type_A:
                    recyclerView.setVisibility(View.GONE);
                    break;
                case Type_B:
                    recyclerView.setVisibility(View.GONE);
                    break;
                case Type_C:
                    recyclerView.setVisibility(View.GONE);
                    break;
            }
        }
    });
}

public void addItem(Type_General item) {
    mDataset.add(item);
}

public void addAllItems(List<Type_General> items) {
    mDataset.clear();
    mDataset.addAll(items);
}

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

}
class SuggestionAdapter扩展了RecyclerView.Adapter{
私有列表数据集;
私有EditProfileFragment.SuggestionEditTextEnum editTextEnum;
私人编辑文本;
私人回收站;
类ViewHolder扩展了RecyclerView.ViewHolder{
文本视图mTextView;
ViewHolder(文本视图v){
超级(五);
mTextView=v;
}
}
SuggestionAdapter(列出myDataset、EditProfileFragment.SuggestionEditTextEnum、editTextEnum、,
EditText EditText,RecyclerView RecyclerView){
mDataset=myDataset;
this.editTextEnum=editTextEnum;
this.editText=editText;
this.recyclerView=recyclerView;
}
@凌驾
公共建议Adapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext())
.充气(R.layout.textview_带圆角,父级,假);
返回新的ViewHolder((TextView)v);
}
@凌驾
BindViewHolder上的公共无效(最终建议Adapter.ViewHolder,最终int位置){
holder.mTextView.setText(大写首字母(mDataset.get(position.getName()));
holder.mTextView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
开关(editTextEnum){
案例类型_A:
recyclerView.setVisibility(View.GONE);
打破
案例类型_B:
recyclerView.setVisibility(View.GONE);
打破
案例类型_C:
recyclerView.setVisibility(View.GONE);
打破
}
}
});
}
公共作废附加项(类型\一般项){
mDataset.add(项);
}
公共无效添加项(列表项){
mDataset.clear();
mDataset.addAll(项目);
}
@凌驾
public int getItemCount(){
返回mDataset.size();
}
}

既然
Type\u General
Type\u A
Type\u B
Type\u C
的父类,那么这难道不应该起作用吗

此外,我认为您必须对数据进行
显式转换,如下所示:

 Type_General = mDataset.get(position);

 if (Type_General instanceof Type_A){

    Type_A = (TypeA) Type_General;
 }

 holder.mTextView.setText(capitalizeFirstLetter(TypeA.getName()));
集合
不能强制转换为
集合
。这可能是编译器的限制

但是,只要合理地使用您的集合(我的意思是,使用List::add、List::addAll或任何其他方法,而不仅仅是简单地分配
集合
),就不会有任何问题

如果你只是:

private final List<Type_General> mDataset = new ArrayList<>();

    SuggestionsAdapter(List<? extends Type_General> myDataset, EditProfileFragment.SuggestionsEditTextEnum editTextEnum,
                       EditText editText, RecyclerView recyclerView) {
        mDataset.addAll(myDataset);
    }
private final List mDataset=new ArrayList();

SuggestionAdapter(ListCollection不能强制转换到集合中。但是您可以执行
Collection Collection=(Collection)((Object)yourParentClassCollection)
,但这非常难看。没有stacktrace,这是他的IDE中的编译错误。如果我尝试运行它,我会得到:
错误:(229,61)错误:不兼容的类型:列表无法转换为列表
我想我得到了它,而是将
列表
传递给适配器,创建
列表
,并在
列表
中添加所有对象
类型a
类型B
,然后使用构造函数将其传递给适配器。