Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何引用子类作为类型参数? 有没有办法将当前类的子类用作泛型类的类型参数?_Java_Generics_Reference - Fatal编程技术网

Java 如何引用子类作为类型参数? 有没有办法将当前类的子类用作泛型类的类型参数?

Java 如何引用子类作为类型参数? 有没有办法将当前类的子类用作泛型类的类型参数?,java,generics,reference,Java,Generics,Reference,我不太确定如何暴露我的问题,因此我将举一个例子: 例子 我的连接对象负责通过网络发送和接收某种类型的(子类的)消息(仅复制此处的相关部分): 当然,我有几个Message的子类 问题 我的问题来自Message的连接conn属性:在当前状态下,eclipse告诉我 类型连接中的send(capture#7-of?)方法不适用于参数(消息) 对于连接我应该使用什么类型的参数,以便它与消息的任何子类兼容 我试过的 我尝试将消息声明为: public abstract class Message<

我不太确定如何暴露我的问题,因此我将举一个例子:

例子 我的
连接
对象负责通过网络发送和接收某种类型的(子类的)
消息
(仅复制此处的相关部分):

当然,我有几个
Message
的子类

问题 我的问题来自
Message
连接conn
属性:在当前状态下,eclipse告诉我

类型连接中的send(capture#7-of?)方法不适用于参数(消息)

对于
连接
我应该使用什么类型的参数,以便它与
消息
的任何子类兼容

我试过的 我尝试将
消息
声明为:

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;
    }
}