基本接口说明

时间:2012-11-30 20:34:37

标签: java generics interface

我觉得我应该知道这一点,但在被问到时却无法解释。 我有一个方法:

public <T extends IByteConverter<T>> int write(T obj) throws IOException {
    byte[] byteArray = obj.toByteArray();
    raFile.write(byteArray);
    //keeps track of size of what was written
    return byteArray.length;
}

和我的界面:

interface IByteConverter<T> {
    public byte[] toByteArray();
    public T fromByteArray(byte[] byteArray);
}

当我调用obj.toByteArray()时,我的程序如何知道该怎么做?我的班级没有,我实际上在IByteConverter中实现了代码,但该程序正如预期的那样工作。有没有一种简单的方法来解释发生了什么?

2 个答案:

答案 0 :(得分:3)

让我们用另一个例子让事情更容易理解:你定义了一个接口Fruit,它有一个方法getColor()。这种方法的合同是它返回一种颜色。

根据此合约,您可以定义一个采用Fruit数组的类,并计算红色数。

你不需要为编译这个方法做任何实现,因为你可以确定唯一可以传递给这个方法的是一个对象数组,它是一个实例。确实实现Fruit接口的类。为了使此方法运行,您需要至少定义一个实现Fruit接口的类(例如Apple),并构造一个这个类的对象数组。

这就是多态性的全部意义:只要它尊重其接口的契约,你就可以在不知道它的实际类是什么的情况下调用对象的方法。

泛型不会让这与众不同。由于obj的类型为T,并且T延伸IByteConverter,因此您可以在toByteArray()上调用obj方法。

答案 1 :(得分:0)

这种方法<T extends IByteConverter<T>>可以让我们了解对象T的内部方法。此声明要求呼叫者输入extends类型IByteConverter的参数,以便至少可以在此方法中访问IByteConverter中的所有方法。