1

由于 SeekableByteChannel是一个接口,我们如何从 Files 类的newByteChannel方法调用它的方法。

我知道如何调用它。但我无法理解这个概念,因为接口没有实现行为

还有1个问题。我在java示例代码中多次看到调用或调用接口方法。但据我所知,接口没有初始化或实现方法。

SeekableByteChannel idd =  Files.newByteChannel(file);
idd.size();

上面的代码是如何工作的,因为 SeekableByteChannel 是一个接口,而 Files 类没有实现 SeekableByteChannel 的方法。所以在哪里初始化 SeekableByteChannels 方法。

请帮忙

4

2 回答 2

0

Java 中的 aninterface只不过是一个合约。在编译器级别,唯一的约定是,如果您implements是接口,则必须具有所有方法的实现(对于不是 的类abstract):

public interface Foo
{
    /*
     * Any invocation of this method sends the instance to the moon
     */
    void foo();
}

如果您有一个可以实例化并实现的具体类Foo,例如:

public class MyClass
    implements Foo
{
    // must implement foo()
    @Override
    public void foo() { stayOnEarth(); }
}

那么你可以这样做:

final Foo foo = new MyClass();

由于您引用了 type 的实例Foo,这意味着您可以foo()对其进行调用:

foo.foo();

JVM 将查找方法foo()并找到它。

现在:您已经实施的事实foo()是一回事;您遵守此接口的约定这一事实是另一回事。如果您留在地球上或直接前往 Antares,编译器不会发出 <beep>:它无法强制执行

这首先是一个信任问题:如果你实现了一个接口,你应该理解这个接口的含义;这就是为什么有文档的原因。编译器只能强制您至少实现所需的方法。

于 2013-06-12T19:59:02.893 回答
0

看来您的根本问题是接口如何工作。与接口相关的常见流行语是“合同”。如果你的类实现了一个接口,它就实现了这个契约。契约意味着类必须定义接口中声明的函数。因此,如果我们有 -

Interface InterfaceTest{
    void foo();
}

Class Implementer implements InterfaceTest{

类实现者必须实现函数 foo() 否则会出现编译器错误 -

void foo(){
    //Do stuff.
}

注意Files不实现。_ SeekableByteChannel所以 Files和它没有任何关系。因此Files可以拥有它想要的任何功能,包括SeekableByteChannel没有问题的功能。

于 2013-06-12T19:47:01.387 回答