Set
まず、代わりにsを使用して問題を減らしましょう。
Set<Set<Long>> longSetSet = null;
Set<Set<Double>> doubleSetSet = null;
Set<Set<? extends Number>> someNumberSetSet;
// try assigning them
someNumberSetSet = longSetSet; //
someNumberSetSet = doubleSetSet; // compiler errors - incompatible types
一見すると、なぜこの割り当てが違法であるのか不思議に思うかもしれません。結局のところ、にを割り当てることができるSet<Long>
からですSet<? extends Number>
。理由は、ジェネリックが共変ではないためです。コンパイラは、にを割り当てることができないのと同じ理由で、Set<Set<Long>>
にを割り当てることを防ぎます。詳細については、リンクされた回答を参照してください。Set<Set<? extends Number>>
Set<Long>
Set<Number>
回避策として、他の回答が示唆しているように、メソッドシグネチャでタイプパラメータを使用できます。別のワイルドカードを使用して、割り当てを合法にすることもできます。
Set<? extends Set<? extends Number>> someNumberSetSet;
someNumberSetSet = longSetSet; //
someNumberSetSet = doubleSetSet; // legal now
またはあなたの例では:
function(Map<Integer, ? extends Map<Integer, ? extends Number>> arg) { }