繁体   English   中英

Java参数化方法说明

[英]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
}

你可以看到ClassDTOInteger不是真正的类型,而是类型参数(如TN ),它们被称为这种方式。 不遵循命名类型参数的约定可能会导致您的困惑。

当它就像这样时,覆盖更清楚:

@Override
public <T, N> T call(N n) {
  ...
}

替换类型参数ClassDTOInteger的类型将是您调用call()方法的类型:

Class instance = new Class();
Integer integer = 5;
ClassDTO result = instance.<ClassDTO, Integer>call(integer);

但是,这不会在调用service.doSome(id)时解决编译错误。

为了使其编译,您可以使用TN参数化Common接口,然后您的Class可以使用特定类型( CommonDTOInteger )实现通用接口:

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方法覆盖主体中的Integerjava.lang.Integer的事实。

当跳过简单的单大写字母类型变量命名约定时,泛型经常发生这种情况。

参数Integer iddoSome所采用的doSome ,大概是java.lang.Integer


旁注:您隐藏了隐式导入的类( ClassInteger ),众所周知,这会导致错误; 除了不遵循类型变量的命名约定之外。 约定有时有助于防止错误!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM