加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何声明一个包含实现接口的类的子类的变量?

发布时间:2020-12-15 08:35:49 所属栏目:Java 来源:网络整理
导读:我想声明一个包含实现特定接口的类的变量.具体来说,我正在尝试将SocketChannel和DatagramChannel存储在同一属性中,以便我可以互换使用它们.这两个类都扩展了SelectableChannel并实现了ByteChannel,我希望从两者中调用方法.我不想将它存储在两个单独的变量中,
我想声明一个包含实现特定接口的类的变量.具体来说,我正在尝试将SocketChannel和DatagramChannel存储在同一属性中,以便我可以互换使用它们.这两个类都扩展了SelectableChannel并实现了ByteChannel,我希望从两者中调用方法.我不想将它存储在两个单独的变量中,因为我需要将它们作为同一个对象.我想在一个变量中将此对象传递给构造函数.

甚至可以这样做吗?如果没有,那么仍然支持这种模型的常见解决方法是什么?为清楚起见,这里是(不正确的)声明可以描述我正在尝试做什么,如果它们有效:

private SelectableChannel & ByteChannel byteChannel;
private SelectableChannel implements ByteChannel byteChannel;
private ? extends SelectableChannel implements 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 – 在您的情况下更方便).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读