假设编写了以下类:
<b>public</b> <b>class</b> MessagePublisher <b>extends</b> AMQPublisher{ <b>public</b> String message; <b>public</b> MessageEncoder messageEncoder; <b>public</b> MessagePublisher(String message) { <b>super</b>(); <font><i>//Assume AMQPublisher has a NoArgs constructor</i></font><font> <b>this</b>.message = message; <b>this</b>.messageEncoder = <b>new</b> MessageEncoder(); } <b>public</b> <b>void</b> publishMessage() throws MessageEncodingException { <b>final</b> EncodedMessage encodedMessage = messageEncoder.encode(message); sendMessage(encodedMessage); } } </font>
现在,假设我们要为另一条消息做同样的事情,只是这次消息不是字符串类型,而是是整数、双数或枚数?
我们是否需要再写3到4个类,其中95%的代码都是一样的?
不,只要你知道泛型。
以上述例子为例,我们将需要做一些修改:
<b>public</b> <b>class</b> MessagePublisher<T> <b>extends</b> AMQPublisher{ <b>public</b> T message; <b>public</b> MessageEncoder messageEncoder; <b>public</b> MessagePublisher(T message) { <b>super</b>(); <font><i>//Assume AMQPublisher has a NoArgs constructor</i></font><font> <b>this</b>.message = message; <b>this</b>.messageEncoder = <b>new</b> MessageEncoder(); } <b>public</b> <b>void</b> publishMessage() throws MessageEncodingException { <b>final</b> EncodedMessage encodedMessage = messageEncoder.encode(message); sendMessage(encodedMessage); } } </font>
你会注意到,我们已经把所有出现的String message替换成了T message,其中T是一个参数化的类型引用,与类名一起声明。
注意:虽然我们把它看作是T,但你可以给它起任何名字 尽管社区中大多数人都使用T,所以保持这种方式是很好的,这样如果有新的人进来查看代码,他们就不会为一个不寻常的参数化类型符号而苦恼。
让我们访问同一个例子,看看如何使其发挥作用。
<b>public</b> <b>class</b> Main { <b>static</b> { <b>final</b> String stringMessage = <font>"Message"</font><font>; <b>final</b> Integer intMessage = 5; <b>final</b> Float floatMessage = 5.0; MessagePublisher<String> stringMessagePublisher = <b>new</b> MessagePublisher<>(stringMessage); MessagePublisher<Integer> intMessagePublisher = <b>new</b> MessagePublisher<>(intMessage); MessagePublisher<Float> floatMessagePublisher = <b>new</b> MessagePublisher<>(floatMessage); List<MessagePublisher> messagePublisherList = <b>new</b> ArrayList<>(); messagePublisherList.append(stringMessagePublisher); messagePublisherList.append(intMessagePublisher); messagePublisherList.append(floatMessagePublisher); } <b>public</b> <b>static</b> <b>void</b> main(String[] args) { </font><font><i>// Publish all messages.</i></font><font> messagePublisherList.stream().forEach(<b>this</b>::publishMessage); } } </font>