我想声明一个变量,该变量包含一个实现特定接口的类。具体来说,我试图将SocketChannelDatagramChannel存储在同一属性中,以便可以互换使用。这两个类都扩展了SelectableChannel,并且还实现了ByteChannel,我希望从两者中调用方法。我不想将其存储在两个单独的变量中,因为我需要将它们作为同一对象。我想将此对象的一个​​变量传递给构造函数。

甚至有可能这样做吗?如果没有,仍然支持这种类型的模型的常见解决方法是什么?为了清楚起见,以下(错误)声明可以描述我正在尝试执行的操作,如果它们有效:

私有SelectableChannel和ByteChannel byteChannel;
private SelectableChannel实现ByteChannel byteChannel;
私人的 ?扩展SelectableChannel实现ByteChannel byteChannel;

请注意:

我不是在寻找避免该问题的其他方法来处理网络,也没有在寻找实现网络的其他方法。这个问题是关于声明一个变量来保存一个类的子类,该类也实现了一个特定的接口。我仅给出详细信息,以便您知道无法创建新的接口或子类,因为在这种情况下,所有涉及的类都是java.nio包的一部分。

最佳答案

Java中没有办法以您想要的方式声明变量。

您可以使用SelectableChannel作为变量的类型(因为这是SocketChannelDatagramChannel的超类型),并在需要从该接口调用方法时将其强制转换为ByteChannel。简单的例子:

class MyClass {
    private SelectableChannel channel; // either a SocketChannel or a DatagramChannel

    public int readStuff(ByteBuffer buffer) {
        // Cast it to a ByteChannel when necessary
        return ((ByteChannel) channel).read(buffer);
    }
}

(或者反过来:将变量声明为ByteChannel并在必要时强制转换为SelectableChannel-以您的情况为准)。

09-27 23:05