2011-06-25 4 views
2

GenericクラスのJavaでメソッド/コンストラクタの戻り型の前に提供/提供していない根拠は何ですか?背景Generativeクラス用Javaのメソッド/コンストラクタの戻り型の前に<T>を提供/提供していない背景

私はそれの周りに頭を上げることはできません。

ときには、それが欲しいときもあり、時にはそうでないこともあります。私たちはコンストラクタのためにそれを必要としますか? ルールはランダムで、論理的な説明が見つからないようです。

答えて

2

<T>メソッド定義では、型がメソッドシグネチャで定義され、そのメソッド内でのみ使用されることを意味します。

+0

また、汎用パラメータをバインドすることもできます。たとえば、次のように定義します。

2

<T>を、そのメソッドに関連付けられているジェネリックを含むクラスではなく、そのメソッドの戻り型の前に置きます。

class Foo { 
    // T is associated with the method 
    <T> T stuff(T x) ... 
} 

class Bar<T> { 
    // T is associated with the class 
    T stuff(T x) ... 
} 

class Baz<T> { 
    // S is associated with the method, T with the class 
    <S> T stuff(S x) ... 
    <S> S otherStuff(T x) ... 
} 

class WTF<T> { 
    // Legal, but redundant 
    <T> T stuff(T x) ... 
} 

コンストラクタに違いはありません。

class Weird { 
    // T is associated with the constructor only 
    <T> Weird(T arg) ... 
} 

のように、コンストラクタにジェネリックを置くことは可能ですが、これは珍しいことです。それは

class Normal<T> { 
    // T is associated with the class, as usual 
    Normal(T arg) ... 
} 
0

に時にはそれはそれ、時には ない望んでいるようなコンストラクタは、クラスレベルのジェネリックを使用見ることがはるかに一般的です。以下の場合に

は、ジェネリック型が/宣言されたクラス定義の一部として定義されているので、必要ではない以下の場合に

public class Example<T> { 

    public T generateItem() { return null; }; 

} 

ジェネリックので、それは、必要ですタイプはは、クラス定義(または他の場所)の一部として定義/宣言されていません:

public class Example { 

    public <T> T generateItem() { return null; }; 

} 

ルールがある:それはどこかのコンテキスト内か宣言されていますか?それでおしまい!

関連する問題