如何在Java中声明泛型方法

Shv*_*alb 1 java java-8

我想创建一个函数来获取Class的参数并返回T的实例,

所以我有这个签名:

public <T> T foo(Class<T> clazz) {}
Run Code Online (Sandbox Code Playgroud)

现在,假设我想限制Class<T>并仅接受<T extends Command>,所以我尝试了这个:

public <T> T foo(Class<T extends Command> clazz) {}
Run Code Online (Sandbox Code Playgroud)

但是,我的班级Command也是模板如下:Command<S extends ModuleContex>

所以我试试这个:

public <T> T foo(Class<T extends Command<S extends ModuleContext>> clazz) {}
Run Code Online (Sandbox Code Playgroud)

但这不编译!

如何正确写?

Bri*_*etz 6

泛型类或方法的类型参数的界限取决于type参数,而不是使用type参数:

public <T extends Command> T foo(Class<T> clazz) {}
Run Code Online (Sandbox Code Playgroud)

如果Command本身也是通用的,你可以这样做:

public <S, T extends Command<S>> T foo(Class<T> clazz) {} 
Run Code Online (Sandbox Code Playgroud)

如果你想在S上绑定,你也可以这样做:

public <S extends ModuleContext, T extends Command<S>> T foo(Class<T> clazz) {} 
Run Code Online (Sandbox Code Playgroud)