1

継承とジェネリックスは初めてなので、私の質問がばかげている場合は我慢してください。

私は次のものを持っています:

public abstract class car {
    private long id;
    private String name;

    public car (long id, String name) {
        this.id = id;
        this.name = name;
    }

    public final long getID(){
        return id;
    }

    public final String getName(){
        return name;
    }
}

public class sedan extends car {
    public sedan(long id, String name) {
        super (id, name);
    }
    ...
}

public class jeep extends car {
    public jeep(long id, String name) {
        super (id, name);
    }
    ...
}

スピナーのArrayAdapterを次のように拡張しようとしています。

public class DropdownAdapter extends ArrayAdapter<car> {
    private Context context;
    private List<car> values;

    public DropdownAdapter(Context context, int textViewResourceId, List<car> values) {
        super(context, textViewResourceId, values);
        this.context = context;
        this.values = values;
    }
    ...
}

私がそれを使おうとすると問題が起こります:

adapter = new DropdownAdapter (this, android.R.layout.simple_spinner_item, lstSedan);

エラーが発生します:コンストラクターDropdownAdapter(ScreenItemList、int、List <sedan>)が未定義です

adapter = new DropdownAdapter (this, android.R.layout.simple_spinner_item, lstJeep);

エラーが発生します:コンストラクターDropdownAdapter(ScreenItemList、int、List <jeep>)が未定義です

ここでの問題は何ですか?lstSedanまたはlstJeepを車から派生させたときに、パラメーターとして使用できないのはなぜですか?これを解決するにはどうすればよいですか?ありがとう!

4

2 に答える 2

2

タイプのパラメータを期待するメソッドを定義しましたList<a>

  public SpinnerAdapter(Context context, int textViewResourceId, List<a> values)

つまり、 type のアイテムのリストが必要ですa。ただし、型のパラメーターの代わりに、b継承された型のパラメーターを渡します。次の ように使用してみてください。aList<b>

  List<b> lstB= new ArrayList<b>();
  adapter = new SpinnerAdapter (this, android.R.layout.simple_spinner_item, lstB);

JoxTraex が言ったように、Java の命名規則を読む必要があります。

更新
申し訳ありませんが、間違いを犯しました。java はList<ChildClass>にパラメーターを渡すことを許可していないためList<ParentClass>、この場合は継承を使用しないでください。ジェネリックを使ってみる

public class DropdownAdapter extends ArrayAdapter<T> {
private Context context;
private List<T> values;

public DropdownAdapter(Context context, int textViewResourceId, List<T> values) {
    super(context, textViewResourceId, values);
    this.context = context;
    this.values = values;
}
...
}

そして、この関数呼び出しは機能するはずです:

 adapter = new SpinnerAdapter (this, android.R.layout.simple_spinner_item, lstB);
于 2012-08-15T04:42:41.093 に答える
0

この理由は、名前が付けられているためです。具体的には、SDK にSpinnerAdapterが既に存在しています。どちらを使用しているかを明示的に述べるか、クラス名を変更する必要があります。

アドバイス

また、参考までに、クラスを A のような役に立たない名前で呼ぶべきではありません。

于 2012-08-15T03:27:44.717 に答える