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 ;  

    }
}

伊巴尔

public interface IBar {

}
于 2012-08-16T14:37:52.147 回答