我与同事讨论了超级接口和子接口。问题如下: 我们在NIO中实现了自己的“文件系统”,我的同事认为java.nio.file.attribute.BasicFileAttributeView和他的子接口PosixFileAttributeView的javadoc中存在一些错误。 javadocs说BasicFileAttributeView.name()应该返回“basic”,但是javadocs说PosixFileAttributeView.name()应该返回“posix”。 我的同事说PosixFileAttributeView.name()不能返回“posix”,因为BasicFileAttributeView中的api契约,它必须返回“basic”。 他是对的吗?
干杯 Huu Chi Vu
答案 0 :(得分:0)
两个视图都是接口(因此它们没有任何实现)。
BasicFileAttributeView的实现应该返回" basic" for name()。
PosixFileAttributeView的实现应该返回" posix" for name()。
PosixFileAttributeView定义了自己的name()合约,因此它的实现应返回" posix",而不是#34; basic"正如你的同事所暗示的那样。
修改强>
你的同事说:
他看到" api合同"实现BasicFileAttributeView.name()的指定类应返回" basic"
这是真的。
他也说:
所以实现像PosixFileAttributeView这样的BasicFileAttributeView子接口的类也应该返回" basic"而不是" posix"
但是PosixFileAttributeView没有实现BasicFileAttributeView,它正在扩展它并重新定义name()的契约。
答案 1 :(得分:0)
让我们从更正式的角度来看待它:
实现接口Bar的类Foo使以下声明成立:
Foo IS-A Bar。
接口栏扩展和接口Baz使以下声明成立:
Bar IS-A Baz。
" IS-A"是传递性的,因此:
Foo IS-A Baz。
在你的情况下,这意味着:
由于PosixFileAttributeView的每个实现也是BasicFileAttributeView的实现(参见上面的原因),它必须返回" basic",因此PosixFileAttributeView正在破坏BasicFileAttributeView的API契约。
这意味着:
PosixFileAttributeView IS-NOT-A BasicFileAttributeView 。
一个简单的例子,从API来看这是有效的(但不建议):
public boolean isSupported(FileAttributeView view){
switch(view.name()){
case "basic": //do some basic view stuff
return true;
case "foo": //I support foo view too
return true;
default: return false;
}
}
认为你的同事是对的。