2016-01-29 5 views
5
public interface Parent{ 
} 

public class Child implements Parent{ 
} 

public <T extends Parent> Class<T> getClass(){ 
    return Child.class; // compile error, add cast to Class<T> 
} 

私はChild.classを返すとコンパイルエラーが発生します。ジェネリッククラスの型を返すときにJavaコンパイルエラー

+1

public class <? extends Parent> getClass(){戻り値Child.class; }が働きます。最初のバージョンが動作しない理由を理解できません。 – user2201253

+0

いつも 'Child.class'を返そうとするなら、' Class 'を使うべきです... – Codebender

答えて

5

Tにかかわらず、常にChild.classを返すようにJavaに指示することはできません。親から拡張する他のクラスはChildではないかもしれません。また、Tをどこにも使用していないため、コードはあまり意味がありません。 2つの解決策:

public Class<? extends Parent> getAClass() { 
    return Child.class; 
} 

または多分

public <T extends Parent> Class<T> getAClass(Class<T> clazz){ 
    return clazz; 
} 

第二の例は、コンパイルが、Tはクラスレベルで宣言された場合は、おそらくより多くの意味になるだろう。

はまた、私は既存のgetClass()メソッドで名前の衝突を避けるために、あなたのメソッドの名前を変更しました。

1

このコードが法的だったら、書くことが可能になります:

Class<SomeOtherChildClass> clazz = instance.getAClass(); 

明確に既存の実装のための実行時に失敗する(SomeOtherChildClassParentを拡張すると仮定した場合)。

あなたが何をしようとしているかわからないので、私は「訂正された」コードを提供しません。

2

レビューBadChildタイプで呼び出す

public class Main { 
    public interface Parent{} 
    public class Child implements Parent{}   
    public class BadChild implements Parent {} 

    public static <T extends Parent> Class<T> getClazz() { 
     return Child.class; // compile error, add cast to Class<T> 
    } 

    public static void main(String[] args) { 
     Class<BadChild> clazz = Main.<BadChild>getClazz(); 
    } 
} 

次の方法getClazz()は、発信者側に対して有効です。ランタイムエラーにつながるメソッドをコンパイルできる場合だから、これは禁止されています。

関連する問題