标签<>在接口类名称中

时间:2014-03-13 15:03:57

标签: java spring generics spring-batch

我试图学习Spring Batch,本书提供了示例接口类,但是命名约定让我失望。

public interface ItemProcessor<I,O> {
O process(I item) throws Exception;

}

我以前从未见过类名中的参数。它们是出于实际目的还是只是作为指导?如果更改了类名,以下代码会有何不同?

public interface ItemProcessor {
O process(I item) throws Exception;

}

2 个答案:

答案 0 :(得分:7)

您在谈论generics

IO是该类的通用参数。

您可以将ItemProcessor视为ItemProcessorI s的O

了解泛型如何工作的最简单方法是考虑类Box

现在什么是

的框?
class Box<? extends Number>

...是Box的{​​{1}}。

答案 1 :(得分:1)

正如其他人所说,&lt;&gt;内的标识符表明ItemProcessor使用泛型。

代码的第二个例子根本不会编译。随着I&amp;界面定义中缺少O,它们存在于&#34;过程&#34;方法声明会导致编译失败。

当您创建ItemProcessor的实例时,您将向这些通用占位符提供具体类,如下所示:

ItemProcessor<String, Integer> processor = new ConcreteItemProcessor<String, Integer>();
Integer result = processor.process("hello world");

或者更有可能的是,您实际上将ConcreteItemProcessor声明为ItemProcessor的实现&lt; String,Integer&gt;在它的类定义中,以便实例化可以更短一些:

ItemProcessor<String, Integer> processor = new ConcreteItemProcessor();

因为您将处理器声明为字符串和整数的处理器,所以任何尝试使用不同类型的对象都会导致编译错误。你要哪个!在仿制药之前,创造一个真正的&#34;泛型&#34;像这样的接口就是使ItemProcessor进程并返回&#34; Objects&#34;或类似的东西,它会编译,但如果你不小心传递了错误的东西,可能会导致运行时错误。这样,您可以更快地捕获错误,但必须使代码更加冗长。