0

重複の可能性:
List<SubClass> を List<BaseClass> にキャストする最も効率的な
方法

抽象基本クラスがBaseClassあり、その引数として期待される関数を作成すると、クラスのCollection<BaseClass>を使用してその関数を呼び出すとコンパイルに失敗します。Collection<SubClass>SubClass extends BaseClass

基本クラス:

public void addLots(Collection<BaseClass> collection) {
    for(BaseClass yourbase : collection) {
        us.add(yourbase) //what you say!!
    }
}

そしてサブクラスで:

public void addMoreLots(Collection<SubClass> collection) {
    addLots(collection); //FAILS TO COMPILE
}

Collection<SubClass>これで、これがのサブクラスではない理由がわかったと思いますCollection<BaseClass>。この呼び出しを行う正しい方法は何ですか?

4

5 に答える 5

2

ピンチで、Collections.unmodifiableCollection(Collection<SubClass>)を返すことができCollection<BaseClass>ます。(もちろん、コレクションは変更できなくなりますが、それがaCollection<SubClass>をとして安全に扱うことができる理由Collection<BaseClass>です。)

于 2012-09-03T21:34:41.403 に答える
1

<? extends BaseClass>交換する必要があり<BaseClass>ます。の正しい構文addLotsは次のとおりです。

public void addLots(Collection<? extends BaseClass> collection) {
    for(BaseClass yourbase : collection) {
        us.add(yourbase) //what you say!!
    }
}
于 2012-09-03T17:00:08.993 に答える
1

Collectionsコンパイル時、実行時にのみチェックされるため、間違ったタイプのオブジェクトを取り込むコレクションを保護するためにこれが行われます。not

この方法で試してみてください...

public <T extends BaseClass> void addLots(Collection<T> collection){ }

また

public void addLots(Collection<? extends BaseClass> collection) {}

于 2012-09-03T17:01:42.383 に答える
1

使用できます

public void addLots(Collection<? extends BaseClass> collection) {
}

それ以外の

public void addLots(Collection<BaseClass> collection) {
}

これはCollection、基本クラスを拡張する型の をパラメータにすることができることを示します。

于 2012-09-03T17:04:37.907 に答える
0
public void addLots(Collection<? extends BaseClass> collection) {
}

ただし、これではコレクションに追加を呼び出すことはできません (つまり、実行できません ) collection.add()

public void addLots(Collection<? super SubClass> collection) {
}

add を呼び出すことができます (つまり、 を実行できますcollection.add())。

于 2012-09-03T18:02:26.013 に答える