如何在java泛型中的类型参数内定义类型参数

Usa*_*kar 1 java generics type-parameter

我有一条消息 dto

class MyMessage<T>{
  T payload;
  String groupId;
}    
Run Code Online (Sandbox Code Playgroud)

我有一个具有简单实现的接口

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

class SenderService implements Sender<MyMessage>{
    @Override
    public void sendMessage(MyMessage message){...}
}
Run Code Online (Sandbox Code Playgroud)

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

class SenderService implements Sender<MyMessage>{
    @Override
    public <E> void sendMessage(MyMessage<E> message){...}
}
Run Code Online (Sandbox Code Playgroud)

但它会给出编译错误,因为该方法没有正确覆盖。我需要对抽象接口方法进行哪些更改才能使其正常工作?

And*_*ner 5

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

class SenderService implements Sender<MyMessage<String>>{
    @Override
    public void sendMessage(MyMessage<String> message){...}
}
Run Code Online (Sandbox Code Playgroud)

如果您想要 aSenderService发送MyMessage任何类型 type 的 s,请使其实现通配符类型:

class SenderService implements Sender<MyMessage<?>>{
    @Override
    public void sendMessage(MyMessage<?> message){...}
}
Run Code Online (Sandbox Code Playgroud)

如果你想要 aSenderService发送MyMessage特定类型的 s,请使其SenderService通用:

class SenderService<E> implements Sender<MyMessage<E>>{
    @Override
    public void sendMessage(MyMessage<E> message){...}
}
Run Code Online (Sandbox Code Playgroud)