【发布时间】:2018-09-22 14:19:57
【问题描述】:
我不明白为什么两个文件的 URIs 相等,但它们的 String 表示不相等。是bug吗?
assertEquals(new File(".").toURI(), Paths.get(".").toUri()); // pass
assertEquals(new File(".").toURI().toString(), Paths.get(".").toUri().toString()); // fail
// org.opentest4j.AssertionFailedError:
// Expected :file:/path/to/the/directory/./
// Actual :file:///path/to/the/directory/./
更新 1
我知道,从技术上讲,您完全可以实现,其中两个对象基于 equals 方法相等,但 toString() 结果不同。
但是,我只是好奇,对于 URI 类,这是一个好的实现吗:两个 URIs 是相等的,但具有不同的字符串表示。
在我的情况下,它是不同的,因为有不同的getAuthority() 结果。但是,为什么他们是平等的?这令人困惑。如果我不打印结果并检查它的源代码,我不会意识到这一点。
更新 2
根据@VGR 下面的评论,我又做了如下测试:
System.out.println(new File(".").toURI()); // file:/path/to/the/directory/./
System.out.println(Paths.get(".").toUri()); // file:///path/to/the/directory/./
System.out.println(new File(".").toURI().getAuthority()); // null
System.out.println(Paths.get(".").toUri().getAuthority()); // null
如您所见,如果我们从这两个URIs 中得到authority,那么在这两种情况下都是null。
但是,它们没有相同的toString() 输出。
【问题讨论】:
-
当我创建这些 URI 时,它们的字符串形式看起来和你的一样,但是它们都从各自的
getAuthority()方法返回 null,无论是在 Java 8 还是 Java 9 中。所以,它们确实是相等。 -
@VGR 将您的评论添加为 UPDATE 2