Java 如何引用子类作为类型参数? 有没有办法将当前类的子类用作泛型类的类型参数?
我不太确定如何暴露我的问题,因此我将举一个例子: 例子 我的Java 如何引用子类作为类型参数? 有没有办法将当前类的子类用作泛型类的类型参数?,java,generics,reference,Java,Generics,Reference,我不太确定如何暴露我的问题,因此我将举一个例子: 例子 我的连接对象负责通过网络发送和接收某种类型的(子类的)消息(仅复制此处的相关部分): 当然,我有几个Message的子类 问题 我的问题来自Message的连接conn属性:在当前状态下,eclipse告诉我 类型连接中的send(capture#7-of?)方法不适用于参数(消息) 对于连接我应该使用什么类型的参数,以便它与消息的任何子类兼容 我试过的 我尝试将消息声明为: public abstract class Message<
连接
对象负责通过网络发送和接收某种类型的(子类的)消息
(仅复制此处的相关部分):
当然,我有几个Message
的子类
问题
我的问题来自Message
的连接conn
属性:在当前状态下,eclipse告诉我
类型连接连接
我应该使用什么类型的参数,以便它与消息
的任何子类兼容
我试过的
我尝试将消息
声明为:
public abstract class Message<M extends Message<M>> {
private transient Connection<M> conn;
...
}
公共抽象类消息{
专用瞬态连接连接器;
...
}
然后我会:
public class MessageA extends Message<MessageA> {
...
}
公共类消息扩展消息{
...
}
作为一个子类
但是这是一个很大的麻烦(我有很多泛型类使用Message
的子类作为类型参数),而且这似乎不是处理它的正确方法。使用连接
:
公共抽象类消息{
专用瞬态连接连接器;
...
}
为了获得一个M
给conn.send()
,您需要一个抽象方法,该方法将为您提供一个M
,该子类将覆盖提供
public abstract class Message<M> {
abstract M getMessage();
private transient Connection<M> conn;
public void send() {
conn.send(getMessage());
}
}
public class MessageA extends Message<MessageA> {
MessageA getMessage() {
return this;
}
}
公共抽象类消息{
抽象M getMessage();
专用瞬态连接连接器;
公共无效发送(){
conn.send(getMessage());
}
}
公共类MessageA扩展消息{
MessageA getMessage(){
归还这个;
}
}
连接连接如何代码>?@LuiggiMendoza是的,当然是这样!谢谢你的帮助,我想我不应该在这么晚的时候编码。。。请随意发布答案,我会接受的!如果这确实是一个合适的答案,它建议连接
中的发送
参数可能应该是消息
类型,而不是M
;它进一步(不太强烈地)建议连接
类根本不需要类型参数。消息如何知道它的连接?换句话说,“conn”字段是如何填充的?@davmac:连接
确实需要一个类型参数,因为(从设计角度来看)它应该只与消息
的单个子类一起工作。具体来说,Connection#send
使用具有相同类型参数(M
)的其他对象。然而,我确实理解这个设计中有一个缺陷,但它现在起作用了。我欢迎任何其他想法@弗拉德:它通过一个设定器知道(隐藏在这里)。
public class MessageA extends Message<MessageA> {
...
}
public abstract class Message {
private transient Connection<Message> conn;
...
}
public abstract class Message<M> {
abstract M getMessage();
private transient Connection<M> conn;
public void send() {
conn.send(getMessage());
}
}
public class MessageA extends Message<MessageA> {
MessageA getMessage() {
return this;
}
}