我想声明一个变量,该变量包含一个实现特定接口的类。具体来说,我试图将SocketChannel
和DatagramChannel
存储在同一属性中,以便可以互换使用。这两个类都扩展了SelectableChannel
,并且还实现了ByteChannel
,我希望从两者中调用方法。我不想将其存储在两个单独的变量中,因为我需要将它们作为同一对象。我想将此对象的一个变量传递给构造函数。
甚至有可能这样做吗?如果没有,仍然支持这种类型的模型的常见解决方法是什么?为了清楚起见,以下(错误)声明可以描述我正在尝试执行的操作,如果它们有效:
私有SelectableChannel和ByteChannel byteChannel;
private SelectableChannel实现ByteChannel byteChannel;
私人的 ?扩展SelectableChannel实现ByteChannel byteChannel;
请注意:
我不是在寻找避免该问题的其他方法来处理网络,也没有在寻找实现网络的其他方法。这个问题是关于声明一个变量来保存一个类的子类,该类也实现了一个特定的接口。我仅给出详细信息,以便您知道无法创建新的接口或子类,因为在这种情况下,所有涉及的类都是java.nio
包的一部分。
最佳答案
Java中没有办法以您想要的方式声明变量。
您可以使用SelectableChannel
作为变量的类型(因为这是SocketChannel
和DatagramChannel
的超类型),并在需要从该接口调用方法时将其强制转换为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
-以您的情况为准)。