如何在Java中声明泛型方法

时间:2014-10-30 01:26:55

标签: java java-8

我想创建一个获取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) {}

但这不会编译!

如何正确编写?

2 个答案:

答案 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;
   }
}