如何在 java 泛型中的类型参数内定义类型参数
How to define a type parameter inside a type parameter in java generics
我有消息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){...}
}
但由于未正确重写该方法,它给出了编译错误。我需要在我的抽象接口方法中更改什么才能使其工作?
Sender.sendMessage
不是通用方法:您不能在该方法的实现上添加新类型变量:
class SenderService implements Sender<MyMessage<String>>{
@Override
public void sendMessage(MyMessage<String> message){...}
}
如果您想要 SenderService
发送任何类型的 MyMessage
s,请使其实现通配符类型:
class SenderService implements Sender<MyMessage<?>>{
@Override
public void sendMessage(MyMessage<?> message){...}
}
如果您想要 SenderService
发送特定类型的 MyMessage
,请使 SenderService
通用:
class SenderService<E> implements Sender<MyMessage<E>>{
@Override
public void sendMessage(MyMessage<E> message){...}
}
我有消息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){...}
}
但由于未正确重写该方法,它给出了编译错误。我需要在我的抽象接口方法中更改什么才能使其工作?
Sender.sendMessage
不是通用方法:您不能在该方法的实现上添加新类型变量:
class SenderService implements Sender<MyMessage<String>>{
@Override
public void sendMessage(MyMessage<String> message){...}
}
如果您想要 SenderService
发送任何类型的 MyMessage
s,请使其实现通配符类型:
class SenderService implements Sender<MyMessage<?>>{
@Override
public void sendMessage(MyMessage<?> message){...}
}
如果您想要 SenderService
发送特定类型的 MyMessage
,请使 SenderService
通用:
class SenderService<E> implements Sender<MyMessage<E>>{
@Override
public void sendMessage(MyMessage<E> message){...}
}