0

Utilityクラス内に静的メソッドがあります:

public static final <T extends Foo & IBar>  Foo1<T> getBaz(Class<T> fooAndIBarClazz)

私は別のクラスを持っています:

public class FooBar<T extends Foo> {
     private Class<T> fooClazz;
//...
}

FooBar呼び出したいインスタンスの内側からUtility.getBaz()

public void aMethod() {
   Utility.getBaz(fooClazz); // fails with not a valid substitute for the bounded parameter
   //Utility.<IBar>getBaz(fooClazz); // fails as well
}

追加のキャストなしで、この一般的な方法でユーティリティメソッドを呼び出すことは可能ですか?

4

2 に答える 2

6

Javaのジェネリックは、コンパイル時の型チェックを追加し、基本的にキャストを回避するのに役立ちます。キャスティングではできないことがあると、ジェネリックスでもできなくなります。

メソッドを呼び出しているクラスがIBarを実装していることを確認できない場合、呼び出されたメソッドはそれをどのように処理すると思いますか?明らかに、IBarが定義するメソッドが必要です(そうでない場合、そのシグネチャはありません)。そのため、その仕事を実行することはできません。

于 2012-08-16T14:32:51.367 に答える
0

投稿されたコードは不完全なようです。これはすべて私のために働きます。

フーバー

public class FooBar<T extends Foo> {

    public void aMethod() { 
        Utility.getBaz( Foo.class ) ;
    }

}

フー

public class Foo<T> implements IBar {

}

効用

public class Utility {
    public static final <T extends Foo & IBar>  Foo<T> getBaz(Class<T> fooAndIBarClazz){

        try {
            return fooAndIBarClazz.newInstance() ;
        } catch( InstantiationException e ) { 
            e.printStackTrace();
        } catch( IllegalAccessException e ) {
            e.printStackTrace();
        } 

        return null ;  

    }
}

Ibar

public interface IBar {

}
于 2012-08-16T14:37:52.147 に答える