0

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

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 中实现代码,但程序按预期工作。有没有一种简单的方法来解释发生了什么?

4

2 回答 2

3

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

基于这个契约,你定义了一个类,它接受一个Fruits 的数组,并计算红色的数量。

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

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

泛型不会使这有所不同。由于obj是类型T,并且由于T扩展IByteConverter,您可以调用toByteArray()方法 on obj

于 2012-11-30T20:42:38.400 回答
0

这种类型的方法<T extends IByteConverter<T>>提供了了解 object 内部方法的可能性T。此声明要求调用者放置该extends类型的参数,IByteConverter以便至少IByteConverter可以在此方法中访问所有方法。

于 2012-11-30T20:36:11.637 回答