2

とのようnode<E>な2つの操作を持つジェネリック型があり、それまでにインスタンスになる場合、コンパイラが少なくとも使用を許可しないのはなぜですか?他のタイプが許可されない理由は理解できますが、ノードのタイプは少なくとも数値になると確信しているので、数値タイプの入力を許可しないのはなぜですか?setData(E Type)E getData()s0nodenode<? extends Number>s0.setData(Number Type)setData

私のコードは次のようになります:

class Node<E> {
private E data;
// ...
public void setData(E obj) { data = obj; } // (1)
public E getData() { return data; } // (2)
// ...
}
Node<? extends Number> s0 = new Node<Number>();
s0.setData(200); //this is not allowed why?
Node<Number> s0 = new Node<Number>();
s0.setData(100); //But this is allowed!
4

3 に答える 3

1

タイプaを宣言しましたNode<? extends Number>。あなたがそれに割り当てるものは無関係です。

コンパイラに関する限り、次のいずれかになります。

  • Node<Integer>
  • Node<Float>
  • Node<Double>

また、どのタイプが実際のタイプであるかを知る方法はありません。

(自動ボックス化された)を渡そうとしていますIntegerが、コンパイラは実際の型がを受け入れることができることを認識できませんInteger

于 2013-03-13T03:58:59.607 に答える
0

参照があるとしましょうNode<? extends Fruits> s0。それはそれが指すことができることを意味します

Node<? extends Fruit> s0 = new Node<Fruit>; 

だけでなく、

Node<? extends Fruit> s0 = new Node<Apple>; 

Node<? extends Fruit> s0 = new Node<Banana>; 

Fruitバナナやリンゴに追加しても安全だと思いますか?またはバナナからリンゴへ?AppleとBananaに、Fruitにはないメソッドが含まれている場合はどうなりますか。

于 2013-03-13T03:31:17.800 に答える
0

実質的に:Node<Integer>たとえば、はではないためNode<Double>でもありませんNode<Number>

例:

Node<? extends Number> s0 = new Node<Integer> ();
s0.setData(Double.valueOf(2.0d)); //that's not possible...

実際には、一般的なタイプが何であるかがわからないため、メソッドs0を呼び出すことはできません...setDatanull

于 2013-03-13T03:32:05.690 に答える