2011-03-25 8 views
1

のサブクラスをインスタンス化:以下に示すように、私は単純なジェネリッククラスを有するジェネリック型クラス

public class Test<T extends Number> { 

    public void doSomething() { 
     Test t = new Test(); 
     t.getNumber(); 

    } 

    public T getNumber() { 
     T d = new Double("1.5"); // I get an compiler error here! 
     return d; 
    } 
} 

はgetNumber方法は(数を拡張)Tを返し、その実装では、ダブルをインスタンス化します。コンパイラはライン上のエラーを投げている:

T d = new Double("1.5"); // I get an compiler error here! 

エラーは次のとおりです。

Incompatible types: 
[ERROR] found : java.lang.Double 
[ERROR] required: T 

Tは数を拡張しているので、私はこれが動作するように期待しているでしょう。何か不足していますか?

答えて

3

TはNumberを拡張しますが、Doubleを拡張しているわけではありません。 Doubleは、Numberの既知のサブクラスの1つだけです。

+0

私はあなたが何を意味するか参照してください。しかし、それはちょっと混乱します。ありがとう! –

1

左側の汎用パラメータと右側の特定の実装を使用するのは適切ではありません。

0
T d = (T)new Double("1.5"); 

キャストをTに入力する必要があります。問題が解決したにもかかわらず、自分が行っていることを疑っています。

1
  1. テストをインスタンス化するときにコンパイラの警告が表示されます。
  2. Test<Integer>をインスタンス化するとします。 getNumberメソッドの行は、次のようになります。

    整数d =新しいDouble( "1.5");

明らかに、コンパイラエラーが発生するはずです。

私はあなたがジェネリック型引数を使用してはならないことだと思う - とあなたのクラスを置き換える:

public class Test { 
    public Number getNumber() { 
     Number d = Double.valueOf("1.5"); // No compiler error 
     return d; 
    } 
} 

別の解決策は、あなたが型引数、つまりとして、ダブルの任意のスーパークラスを使用することができる状態を表現することです:

public class Test<T super Double> { 
    public T getNumber() { 
     T d = Double.valueOf("1.5"); // No compiler error 
     return d; 
    } 
} 

いくつかの一般的なヒント:

  • は良いことなく、プリミティブ型をボックスしないでください理由。
  • ボックス化されたプリミティブ型のインスタンス化にnewを使用しないでください。代わりに、ボクシングクラスの静的ファクトリメソッドを使用してください。
  • 正当な理由なしにジェネリック型を使用しないでください。ジェネリック型を定義する手間がかかる場合は、型パラメータなしでインスタンス化しないでください。
0

class Test<T extends Number>は、Testクラスのオブジェクトの作成を選択するユーザーは、使用する型パラメータを選択できることを意味します。ユーザーは、クラスの実装者としてあなたを選択しません。

これはあなたが何とかTオブジェクト

  • リターンnull
  • として送られてきた物、それはなります入力していることを確認し、そのため、あなたの getNumber()方法することができる唯一の安全

    • 復帰することはできません意味
    • Tを返す他のメソッドが返すオブジェクトを返します。
      • リターンClass<T>(またはClass<? extends T>
      • リターンからCollection<T>(またはCollection<? extends T>)からオブジェクトを作成したオブジェクトと同様の
      • 何かが