我有以下服务方法:

public static <T> T service(final Class<T> klass) {...}


我用这种方式

SomeService someService = service(SomeService.class);


但是,使用这种方法无法获得通用服务,例如,如果需要我该怎么办

SomeService<Foo> someService = ???


怎么做?如何进行服务方法签名?

最佳答案

这是Java的一个缺点-它没有更高类型的类型(您可能要看一下:https://en.wikipedia.org/wiki/Kind_(type_theory))。这意味着一个方法不能知道它是否是其类型参数之一,它不接受类型参数以及需要接受多少个参数。但是,假设您是SomeService和其他Service类的作者,则可以定义如下接口:

public interface IService<F> {
 //The rest could be empty
}

//And then
public static <F, T extends IService<F>> T service(final Class<T> klass) {}


但是,由于您正在使用反射,因此您已经在处理不保证保留类型安全性的不安全操作,因此,将类型转换为SomeService确实是您最不担心的事情。如果您愿意,甚至可以这样重写您的方法,其中T为SomeService,R为SomeService<Foo>

public static <T, R> R service(final Class<T> klass) {
  T result = ...;
  return (R) result;
}

10-08 18:51