2016-04-01 9 views
0

これは、有効なJavaの文法のようだ:「<T> T get()」とはどういう意味ですか? (そして、それは便利です?)

<T> T get(); 

しかし、それが何を意味するのでしょうか?それは役に立ちますか?


DOWNVOTERS

私はこのように、Tは、メソッドのパラメータで使用されるとき、それが何を意味するかを理解するFOR明確化:

T get(Class<T> clazz); 

戻り値の型がありますクラスからinferrableです

しかし、どのタイプがTであるかを示すパラメータがない場合、どのタイプが それ?

+0

これは、タイプ「T」の値を返す一般的なメソッドです。メソッドシグネチャの前の ' 'は、' T'がこのメソッドの型パラメータであり、それを所有するクラスではないことを示しています。 – dasblinkenlight

+3

それは呼び出し側が要求するもので、a)常にスローされます。b)常にnullが返されます。c)悪いハックです。 –

+0

@Louis Wassermanそれでは、基本的には、呼び出し元に型を決定するために渡します。つまり、基本的に型が安全ではありません。あれは正しいですか?それは今まで役に立ちましたか? –

答えて

1

しかし、それは何を意味するのでしょうか?

言語には、できるだけシンプルにするためのルールがあり、ここではそれほど有用ではない方法で結合されていることを意味します。

一般的なメソッドには型パラメータがあります。型パラメーターは、戻り値の型、引数のリスト、メソッド本体で使用できます。それは、まったく含まないものを含め、それらの任意の組み合わせで使用できます。

例えば、これらのシグネチャは、両方のに有用であり得る:

<T> T foo(T t) // The return type can be the type parameter 
<T> List<T> () // A type parameter does not have to be an argument 

<T> T get()の場合は、異なる組み合わせ、同じ規則を使用します。

それは役に立ちますか?

特にありません。あなたは実装を示していません。 @LouisWassermanは、インプリメンテーションがにスロー、ヌル、またはハックのいずれかでなければならないという洞察力のあるコメントに注意します。

これは、ハックの例です。これを行うためのより簡単な方法があるので、私はそれを有用と見なしません。 CからJavaに変換してコードをできるだけ並行にしたい場合には便利です。

public static class Union { 
    public Object o; 
    public Union(Object value) { o = value; } 
    public Class<? extends Object> getType() { return o.getClass(); } 
    public <T> T value() { 
     return (T) o; // <-- uses type parameter to cast 
    } 
} 

public static void main(String[] args) { 
    Union union = new Union("foo"); 

    Class<?> valueType = union.getType(); 
    if (valueType.equals(String.class)) { 
     String s = union.value();  // <-- the call 
     System.out.println(s); 
    } 
} 
0

これは本当にシャグを意味します。以下のコードは警告とともにコンパイルし、次にbarfをコンパイルします。タイプが何らかのポイントであることを宣言/推論せずにメソッドをタイプする正当な理由はありません。 (おそらく、あなただけの一箇所にキャストする必要があり除き)

public class GenericExample { 
    public static void main(String[] args) { 
     String eejits = get(); 
     System.out.println(eejits); 

     Integer knobends = get(); // Throws a ClassCastException. 
    } 

    private static <T> T get() { 
     return (T) "I love to downvote without explaining why"; 
    } 
} 

より明確にするために、それは

public class GenericExample { 
    public static void main(String[] args) { 
     String s = (String) get(); 
     System.out.println(s); 

     Integer i = (Integer) get(); 
    } 

    private static Object get() { 
     return "I really hope the caller expects a String, cos otherwise I'm going to downvote them"; 
    } 
} 
1

これを行うよりも良いませんそれはあなたがreturn-を割り当てている変数の型であります〜への値。

public static <T> T getGenericNumber() { 
    // the number-generator might return int, double, float etc. values 
    return (T) numberGenerator.getANumber(); 
} 

あなたは、例えば、二重の値に直接メソッドの戻り値を割り当てることができます - キャストなし:あなたはこのような方法がある場合 は

Double a = getGenericNumber(); 

をだから、基本的に移動しました変数の宣言からメソッドにキャストします。

あなたはこのようなことを行うことができます原因あなたは簡単にキャスト例外を生成することができますので、これは潜在的に危険である - と、まだコンパイルすることができること:

String s = getGenericNumber(); 
+1

ええと、 'extends Number'に明示的にバインドしていれば' String s = getGenericNumber() 'はできません。しかし、私はあなたのポイントを得る。 –

+0

ええ、あなたは正しい - この場合、数字だけに割り当てることができる - 私はそれを変更するつもりだ –

関連する問題