2016-11-30 4 views
0

ん:ジェネリック型パラメータはエラーを与えるが、ワイルドカードタイプのパラメータは、次のタイプは、任意のコンパイラの警告を生成しませんしませ

public abstract <T extends BaseType> Class<T> getSubclassType(); 

    @Override 
    public <T extends BaseType> Class<T> getSubclassType() { 
     return (Class<T>) SubType.class; 
    } 

public abstract Class<? extends BaseType> getSubclassType(); 
@Override 
    public Class<SubType> getSubclassType() { 
     return SubType.class; 
    } 

以下の具体的な方法は、未チェックのキャストコンパイラの警告を生成しますコンパイラーの警告を生成せずに、サブクラスに適切な具体的な型を返す(基本クラスの)汎用型パラメーターでメソッドを定義する方法はありますか?明らかに、私が上で与えた両方の例はうまくいくでしょう、私はメソッドを定義するより正確な方法があるかどうかを知りたいだけです。注:私は、私は次の操作を行うことができることを知っていますか:

public abstract class BaseClass <T extends BaseType> 
public abstract Class<T> getSubclassType(); 

ジェネリック型を持つメソッドヘッダ自体を、定義する方法があるかどうか、私はクラスでそれを定義せず、疑問に思って。また、なぜワイルドカード宣言に警告と警告が与えられていないのですが、「同等の」総称宣言がなぜ好奇心が強いのですか?

+0

は、 'SubType.class'必ずしもタイプ'クラス 'のです。しかし、一般的な方法では、 'SubType.class'が本当に' BaseType'を拡張して警告を出すかどうか暗黙的に知る方法はありません。それを避ける方法については、私は考えることができません。 – Mat

答えて

1

2つは非常に異なります。最初のもので

、呼び出し側は返されClassの型引数が何であるかを知りません。呼び出し元は、その型引数が何であるかについて何も仮定することができません。それ以外には、BaseTypeを拡張します。このメソッドは、タイプ引数がBaseTypeの任意のサブタイプであるClassを返すことを選択できます。第2のケースで

、この方法は、一般的な方法であり、Tメソッドの型変数です。つまり、呼び出し元はTを選択して、希望するものにすることができ、そのメソッドがそのタイプのTで魔法のように動作すると期待します。特に、この方法は、その方法がTがすべてであるものについて、実行時に任意の情報を持っていないことを意味し、それにもかかわらず、何とかClass<T>を返す方法を見つけ出す必要があり、任意の引数を受け取りません。明らかに、これは常にnullを返さない限り不可能です。ワイルドカードの例で

+0

は パブリッククラス getSubclassType(){ リターン(クラス)SubType.classに消去された2種類の例はありません。 } – KyleM

+0

@KyleM:両方のための消去が同じである: 'パブリッククラスgetSubclassType(){ リターンSubType.class。 } 'が、それは無関係です。呼び出し元がジェネリックでそれぞれの型シグニチャを使用できることは非常に異なります。 – newacct

+0

実際には完璧な意味合いを持っています。 2番目の例では、呼び出し元は任意の型を指定でき、その型が返されると想定しています。しかし、それは実行時にその型情報を持たないので、明らかに不可能です。逆に、私の最初の例では、呼び出し元は戻される型がBaseTypeを拡張していることだけを知っています。そのタイプについての追加の仮定はできません。 – KyleM

関連する問題