gpt4 book ai didi

java - 两个 URI 对象相等,但它们的 toString() 不同

转载 作者:行者123 更新时间:2023-11-30 06:13:21 26 4
gpt4 key购买 nike

我不明白为什么两个文件的 URI 相同,但它们的 String 表示形式不同。这是一个错误吗?

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 类来说,它是一个好的实现吗:两个 URI 相等,但具有不同的字符串表示形式。

就我而言,它是不同的,因为有不同的 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

如您所见,如果我们从这两个 URI 获取 authority,则在这两种情况下它都是 null

但是,它们没有相同的 toString() 输出。

最佳答案

URI#toString() 方法有详细记录 here :

Returns the content of this URI as a string. If this URI was created by invoking one of the constructors in this class then a string equivalent to the original input string, or to the string computed from the originally-given components, as appropriate, is returned. Otherwise this URI was created by normalization, resolution, or relativization, and so a string is constructed from this URI's components according to the rules specified in RFC 2396, section 5.2, step 7.

意思是,toString()方法的结果取决于我们初始化URI对象的方式(总共5 constructors。)

在本例中,您尝试以两种不同的方式初始化 2 个 URI 对象,因此 toString() 的结果不同。可以试试normalize()方法。

关于java - 两个 URI 对象相等,但它们的 toString() 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49796390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com