【问题标题】:How to define a type parameter inside a type parameter in java generics如何在java泛型的类型参数中定义类型参数
【发布时间】:2022-01-12 11:48:42
【问题描述】:

我有一条消息 dto

class MyMessage<T>{
  T payload;
  String groupId;
}    

我有一个实现简单的接口

interface Sender<T>{
    void sendMessage(T message);
}

class SenderService implements Sender<MyMessage>{
    @Override
    public void sendMessage(MyMessage message){...}
}

现在 MyMessage 有一个原始类型,我希望 MyMessage 也有一个类型参数,它将动态定义我的有效负载。如何实现?我尝试了以下方法。

class SenderService implements Sender<MyMessage>{
    @Override
    public <E> void sendMessage(MyMessage<E> message){...}
}

但由于方法未正确覆盖,因此会产生编译错误。我需要在我的抽象接口方法中进行哪些更改才能使其正常工作?

【问题讨论】:

  • 如果SenderServiceMyMessage&lt;String&gt;的发件人,那不是只能发MyMessage&lt;String&gt;吗?为什么sendMessageMyMessage&lt;E&gt;E 是任意类型?
  • SenderService 可以发送任何类型的消息。不仅是字符串

标签: java generics type-parameter


【解决方案1】:

Sender.sendMessage 不是泛型方法:您不能在该方法的实现上添加新类型变量:

class SenderService implements Sender<MyMessage<String>>{
    @Override
    public void sendMessage(MyMessage<String> message){...}
}

如果您想要发送任何类型的MyMessages 的SenderService,请使其实现通配符类型:

class SenderService implements Sender<MyMessage<?>>{
    @Override
    public void sendMessage(MyMessage<?> message){...}
}

如果您想要发送特定类型的MyMessages 的SenderService,请将SenderService 设为通用:

class SenderService<E> implements Sender<MyMessage<E>>{
    @Override
    public void sendMessage(MyMessage<E> message){...}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多