我想声明一个变量,它包含一个实现特定接口(interface)的类。具体来说,我试图将 SocketChannel
和 DatagramChannel
存储在同一属性中,以便我可以互换使用它们。这两个类都扩展了 SelectableChannel
并且还实现了 ByteChannel
,我希望从这两个类中调用方法。我不想将它存储在两个单独的变量中,因为它们需要是同一个对象。我想将这个对象在一个变量中传递给构造函数。
这有可能吗?如果不是,仍然支持此类模型的常见解决方法是什么?为清楚起见,以下是(不正确的)声明,它们可以描述我正在尝试做的事情,它们是否有效:
private SelectableChannel & ByteChannel byteChannel; private SelectableChannel implements ByteChannel byteChannel; private ? extends SelectableChannel implements ByteChannel byteChannel;
请注意:
我不是在寻找其他方法来处理网络来避免这个问题,或者其他实现网络的方法。这个问题是关于声明一个变量来保存一个类的子类,该类也实现了一个特定的接口(interface)。我只给出了细节,以便您知道我不能创建新的接口(interface)或子类,因为在这种情况下,所有涉及的类都是 java.nio
包的一部分。
最佳答案
Java 无法按照您希望的方式声明变量。
您可以使用 SelectableChannel
作为变量的类型(因为这是 SocketChannel
和 DatagramChannel
的父类(super class)型),并将其转换到 ByteChannel
每当你需要从该接口(interface)调用方法时。简单示例:
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
- 以您的情况更方便为准)。
关于java - 如何声明包含实现接口(interface)的类的子类的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3977881/