【问题标题】:Can we create and use our own interface instead of defined by the java?我们可以创建和使用我们自己的接口而不是由java定义吗?
【发布时间】:2017-11-09 18:34:00
【问题描述】:

第一季度:(已删除)

Q2 : try-with-resource 创建自己的资源实现AutoCloseable 接口并覆盖close() 方法。

来自 javadoc

任何实现 java.lang.AutoCloseable 的对象,包括所有实现 java.io.Closeable 的对象,都可以用作资源。

所以,我在这里创建了一个简单的程序MyAuto.java

class Demo implements AutoCloseable {
    public void show() {
        System.out.println("show");
    }
    public void close() {
        System.out.println("close from demo");
    }
}

class MyAuto {
    public static void main(String[] args) {
        try(Demo d = new Demo()) {
            int x = 10/0;
            d.show();
        }catch(ArithmeticException e) {
            System.out.println(e);
        }
    }
}

这个程序运行良好。 :) 并给出输出

close from demo :如预期的那样,无论发生什么异常,d都会被关闭。

但我的问题是我没有编写任何关闭此资源的代码,我只是放了一个打印语句。这里实际上关闭资源是什么意思?将null 分配给资源的引用变量或其他任何东西? 或者JVM 在后台运行close() 之后运行任何其他方法。

最后是最重要的问题..

Q3 : 在上述场景中如果我添加自己的接口AutoCloseable

interface AutoCloseable {
    void close() throws Exception;
}

它在编译MyAuto.java时给出编译时错误

error: incompatible types: try-with-resources not applicable to variable type try(Demo d = new Demo()) { ^ (Demo cannot be converted to AutoCloseable).

所以,请告诉我为什么会这样。为什么我们不能创建和使用我们自己的接口而不是 java 提供的接口。我的界面和预定义的界面有什么区别,虽然两者都是一样的。

【问题讨论】:

  • 您是否查看过 try-with-resources 的工作原理?我怀疑互联网上到处都是关于它们的指南。
  • 对第一个问题很抱歉,但第二个和第三个问题是相关的@T.J.Crowder
  • @SandeepRawat:很公平,我冒昧地删除了第一个问题(因为这样做似乎并没有使任何已发布的答案无效)。 (如果你不同意删除它,你可以使用“回滚”功能——点击“Edited XYZ ago”链接,你会看到它。)
  • @Carcigenicate 每个人都在谈论如何,这是我知道的,但我想知道为什么?这就是我在这里发帖的原因

标签: java try-with-resources


【解决方案1】:

我的界面和预定义的界面有什么区别,尽管两者都是一样的。

它们相同。远非如此。

try-with-resources 所需的AutoCloseablejava.lang.AutoCloseable你的自定义 AutoCloseable 不是来自那个包,所以 Java 不会尊重它。

最重要的是,引入这不是最好的方法,因为它只会导致混淆语义和以后的糟糕体验,即使你选择让你的界面扩展 java.lang.AutoCloseable 出于任何原因。

同样...

...我没有写任何关闭这个资源的代码,我只是放了一个打印语句。这里实际上关闭资源是什么意思?将 null 分配给资源的引用变量或其他任何东西?或者 JVM 在后台运行 close() 后运行任何其他方法。

接口不能强制执行类似的操作。它所能做的就是提供一种机制,如果实施得当,它将按照您的预期运行。

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 2011-04-29
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多