[英]Java Parametrized method explanation
我想在CommonInterface
实现一个通用方法,以使用不同的参数实现它并返回类型。
因此我有:
public interface Common {
public <T, N> T call(N n);
}
如果我理解泛型逻辑(可能不是..),调用方法返回一个类型 T 并接收一个类型 N 作为参数。因此:
public class Class implements Common {
@Autowired private SomeService someService;
@Override
public <ClassDTO, Integer> ClassDTO call(Integer id) {
String s = someService.doSome(id); // suppose doSome receive an Integer as param
}
}
DoSome 方法是一个简单的方法,它接收一个整数作为输入参数:
@Service
public class SomeService {
// some @Autowired other service
public String doSome(Integer id) {
// some operation
}
}
我在 doSome(id) 调用中收到一个错误,他说我:
The method doSome(java.lang.Integer) in the type SomeService is not applicable for the arguments (Integer)
就像如果:
public <ClassDTO, Integer> ClassDTO call(Integer id) {
}
上面的Integer
不被识别为java.lang.Integer
。 我试着把java.lang.Integer
如下:
public <ClassDTO, java.lang.Integer> ClassDTO call(Integer id) {
}
但获得其他错误..
怎么了??
如果您更接近call
的覆盖:
public <ClassDTO, Integer> ClassDTO call(Integer id) {
String s = someService.doSome(id); // suppose doSome receive an Integer as param
}
你可以看到ClassDTO
和Integer
不是真正的类型,而是类型参数(如T
和N
),它们被称为这种方式。 不遵循命名类型参数的约定可能会导致您的困惑。
当它就像这样时,覆盖更清楚:
@Override
public <T, N> T call(N n) {
...
}
替换类型参数ClassDTO
和Integer
的类型将是您调用call()
方法的类型:
Class instance = new Class();
Integer integer = 5;
ClassDTO result = instance.<ClassDTO, Integer>call(integer);
但是,这不会在调用service.doSome(id)
时解决编译错误。
为了使其编译,您可以使用T
和N
参数化Common
接口,然后您的Class
可以使用特定类型( CommonDTO
和Integer
)实现通用接口:
public interface Common<T, N> {
T call(N n);
}
Class
将如下所示:
public class Class implements Common<CommonDTO, Integer> {
private Service service;
@Override
public CommonDTO call(Integer n) {
return service.doSome(n);
}
}
现在编译得很好。
您只是忽略了call
方法覆盖主体中的Integer
与java.lang.Integer
的事实。
当跳过简单的单大写字母类型变量命名约定时,泛型经常发生这种情况。
参数Integer id
与doSome
所采用的doSome
,大概是java.lang.Integer
。
旁注:您隐藏了隐式导入的类( Class
, Integer
),众所周知,这会导致错误; 除了不遵循类型变量的命名约定之外。 约定有时有助于防止错误!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.