Java泛型快速介绍 - Prakhar

假设编写了以下类:

<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值