java - 如何声明包含实现接口(interface)的类的子类的变量?

标签 java variables interface subclass nio

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

这有可能吗?如果不是,仍然支持此类模型的常见解决方法是什么?为清楚起见,以下是(不正确的)声明,它们可以描述我正在尝试做的事情,它们是否有效:

private SelectableChannel & ByteChannel byteChannel;
private SelectableChannel implements ByteChannel byteChannel;
private ? extends SelectableChannel implements ByteChannel byteChannel;

请注意:

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

最佳答案

Java 无法按照您希望的方式声明变量。

您可以使用 SelectableChannel 作为变量的类型(因为这是 SocketChannelDatagramChannel 的父类(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/

相关文章:

java - NullPointerException - 无法启动 Activity

java - Swing 自定义组件虚拟鼠标监听器

python - 尝试在 python 中定义一系列数字变量时出现语法错误

PHP OOP 为类变量赋值

java - 回调监听器总是返回 null

java - JLabel自定义事件setText

java - 无限滚动图像 ViewPager

perl - 使用三元运算符赋值?

java - 什么是接口(interface)和包装器?

linux - 模拟进入 Linux 接口(interface)的数据包