2012-01-22 12 views
2

を働いていないタイプを返します。ジェネリックは、私が例を通じてつもり

public interface Visitor<T> { 
    public void visit(T e); 
} 

class Sum<T extends Integer> implements Visitor<T> { 

    private int sum = 0; 



    @Override 
     public void visit(T element) { 
      sum += element; 
     } 

     public T value() { 
      return sum; 
     } 

} 

return文のT値()の戻り合計は、その型の不一致を示すエラーを与えている:それはそうと、どのように問題を修正することですなぜint型からTに変換することはできません。

+0

は、それは'民間T和= 0ではないでしょうか? –

+0

すべての猫がライオンであるわけではありません...;-) T sum = 0の場合 – Cameron

+0

;私は合計に自分の要素を追加することはできません。私は合計+ =要素を意味する; 2番目のメソッドではエラーが返されます。演算子+ =は引数型Tのために未定義です。 – Curious

答えて

3

あなたのケースでは、2つの問題がある:Integerはすなわち、それはfinalクラスだし、拡張することはできませんので

  1. T extends Integerは、正確に有効ではありません。したがって、あなたが安全に第二

    class Sum implements Visitor<Integer> { ... 
    
  2. にあなたのクラス宣言を変更することができ、T value()方法は、インターフェースの一部ではないので、タイプTのこと(べきではない)は必要ありません。安全に交換するには、public int value()またはpublic Integer value()にしてください。

したがって結果のコードは次のようになります。

class Sum implements Visitor<Integer> { 
    private int sum = 0; 

    @Override 
    public void visit(Integer element) { 
     sum += element.intValue(); 
    } 

    public int value() { 
     return sum; 
    } 
} 
+0

ありがとうございました。 – Curious

1

これは、がJavaのプリミティブ型であり、Integerがクラスであるためです。問題はIntegerintを直接割り当てることができないことです。解決策はreturn sum;return (T) sum;に変更することです。ジェネリックの実装では

+0

新しいT(合計)を返しません。新しいT(合計)が機能しています。T型のエラーをインスタンス化できません。 – Curious

+0

public int value(){ \t \t return sum; \t}ありがとうございました。しかし、T(和)平均を知りたい – Curious

+0

'Integer'が' Integer(int) 'のコンストラクタを持っていることを考えると、" new T(sum) "(" T "を' Integer'とすると、あなたはより印象的です)。しかし、私は 'Integer'は拡張できない(または派生した)最終クラスであることを発見しました。あなたの 'T'と' Integer'は正確に何が分かりますか?あなたはJavaでデフォルトの 'Integer'を参照していますか? – grapeot

1

は常にWrapperクラスの代わりに、primitiveデータ型を使用します。例: intのために使用可能なラッパークラスがあり、ダブル、フロート、長いなどにも同様にIntegerを使用する必要があり、それぞれDouble, FloatLongです。

1

あなたは(実際にNumberから継承)クラスIntegerintValue方法を利用することができ、すなわち

sum += element.intValue(); 

あなただけsum += elementを使用できない理由は、コンパイラは具象クラスTが何であるかを知らないということですそれで、それはautoboxできません。 TIntegerとなる可能性がありますが、TT extends Integerと宣言しているため、コンパイラはサブクラスTが実際にどのようなものかわかりません。 Integerが、最終的なクラスであるため

さて、あなたの場合には、それは少し面白いです。コンパイラはTが常にIntegerになることを理解できるはずです。それは明らかにこれをしません。

おそらく、ジェネリックを使用したくない場合があります。Integerのサブクラスはありません。なぜ、ジェネリック宣言を完全に取り除かないのでしょうか?

class Sum implements Visitor<Integer> { 
    public void visit(Integer i) { 
     sum += i; 
    } 
} 

これでうまくいくはずです。 `;

関連する問題