如何引用子类作为类型参数?

时间:2014-08-22 17:47:54

标签: java generics reference

有没有办法将当前类的子类用作泛型类的类型参数?

我不太确定如何揭露我的问题所以我会举个例子:

实施例

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

public class Connection<M extends Message> {
    public void send(M mes) {
        ...
    }
}

我的Message对象是一个抽象类,它超级分类通过网络发送的各种消息。

public abstract class Message {
    private transient Connection<?> conn;

    public void send() {
        this.conn.send(this);
    }
}

当然,我有几个Message的子类。

问题

我的问题来自Connection<?> conn的{​​{1}}属性:在它的当前状态eclipse告诉我

  

方法发送(捕获#7-of?)类型Connection&lt;捕获#7-of?&gt;不适用于参数(消息)

我应该为Message使用哪种类型参数,以便它与Connection的任何子类兼容?

我尝试了什么

我尝试将Message声明为:

Message

然后我会:

public abstract class Message<M extends Message<M>> {
    private transient Connection<M> conn;
    ...
}

作为子类。

但这是一个很大的麻烦(我有很多泛型类使用public class MessageA extends Message<MessageA> { ... } 的子类作为类型参数)并且它似乎不是处理它的正确方法。

2 个答案:

答案 0 :(得分:2)

使用Connection<Message>

public abstract class Message {
    private transient Connection<Message> conn;
    ...
}

答案 1 :(得分:0)

为了获得Mconn.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;
    }
}