子接口中的重写方法

时间:2014-07-17 09:02:28

标签: java interface

我与同事讨论了超级接口和子接口。问题如下: 我们在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

2 个答案:

答案 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。

在你的情况下,这意味着:

  1. BasicFileAttributeView的每个实现都必须返回" basic"在调用" name()"
  2. PosixFileAttributeView的每个实现都必须返回" posix"在调用" name()"
  3. 由于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;
      }
    }
    

    认为你的同事是对的。