1

重複の可能性:
ワイルドカードタイプArrayList内に要素を追加する

コンパイラがこのコードを間違っていると見なす理由がわかりません。

Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo);
Pair<? extends Employee> wildcardBuddies = managerBuddies; // OK
wildcardBuddies.setFirst(lowlyEmployee); // compile-time error

持っているメソッドPair<? extends Employee>は次のとおりです。

? extends Employee getFirst()
void setFirst(? extends Employee)

Employeeのサブタイプであるため、値を設定できない理由は明確ではありません? extends Employee。Javaチュートリアルで説明しようとしますが、まだ質問があります。誰かが明確にしてくれませんか?

4

2 に答える 2

3

コンパイラーにとって、これ? extends EmployeeはEmployeeの1つの特定のサブタイプを意味し、コンパイラーはそれがどのサブタイプであるかを検出する方法がありません。したがって、従業員だけを挿入することはできません。

詳細については、この質問を参照してください: PECS(Producer Extends Consumer Super)とは何ですか?または、AngelikaLangerによるGenericsFAQ
をお 読みください。

于 2012-08-24T10:28:31.050 に答える
2

<? extends Employee>「従業員を拡張する任意のタイプ」としてではなく、「従業員を拡張する特定の、しかし未知のタイプ」として読んでください。

wildcardBuddiesはまだマネージャーのペアであり、実際のタイプは不明になっています。従業員を外に出すことはできますが、マネージャーとLowlyEmployeesのどちらを設定すべきかわからないため、何も設定できません。Pair<? extends Employee>事実上、読み取り専用になります。

于 2012-08-24T10:32:17.857 に答える