我想创建一个获取Class参数并返回T实例的函数,
所以我有这个签名:
public <T> T foo(Class<T> clazz) {}
现在,假设我想限制Class<T>
并仅接受<T extends Command>
,所以我尝试了这个:
public <T> T foo(Class<T extends Command> clazz) {}
但是,我的课程Command
也是模板,如下所示:Command<S extends ModuleContex>
所以我试试这个:
public <T> T foo(Class<T extends Command<S extends ModuleContext>> clazz) {}
但这不会编译!
如何正确编写?
答案 0 :(得分:6)
泛型类或方法的类型参数的界限取决于type参数,而不是类型参数的使用:
public <T extends Command> T foo(Class<T> clazz) {}
如果Command本身也是通用的,你可以这样做:
public <S, T extends Command<S>> T foo(Class<T> clazz) {}
如果你想在S上绑定,你也可以这样做:
public <S extends ModuleContext, T extends Command<S>> T foo(Class<T> clazz) {}
答案 1 :(得分:4)
这为我编译。我并非100%确定它是正确的,您应该使用您使用的实际类型进行测试,以确保其正常工作。
public class GenericMethodTest
{
public static class SomeCommand<X> {}
public static class SomeModule {}
public <T extends SomeCommand<? extends SomeModule>> T getSomething( Class<T> type ) {
return null;
}
}