我觉得我应该知道这一点,但在被问到时却无法解释。 我有一个方法:
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中实现了代码,但该程序正如预期的那样工作。有没有一种简单的方法来解释发生了什么?
答案 0 :(得分:3)
让我们用另一个例子让事情更容易理解:你定义了一个接口Fruit,它有一个方法getColor()
。这种方法的合同是它返回一种颜色。
根据此合约,您可以定义一个采用Fruit
数组的类,并计算红色数。
你不需要为编译这个方法做任何实现,因为你可以确定唯一可以传递给这个方法的是一个对象数组,它是一个实例。确实实现Fruit
接口的类。为了使此方法运行,您需要至少定义一个实现Fruit
接口的类(例如Apple
),并构造一个这个类的对象数组。
这就是多态性的全部意义:只要它尊重其接口的契约,你就可以在不知道它的实际类是什么的情况下调用对象的方法。
泛型不会让这与众不同。由于obj
的类型为T
,并且T
延伸IByteConverter
,因此您可以在toByteArray()
上调用obj
方法。
答案 1 :(得分:0)
这种方法<T extends IByteConverter<T>>
可以让我们了解对象T
的内部方法。此声明要求呼叫者输入extends
类型IByteConverter
的参数,以便至少可以在此方法中访问IByteConverter
中的所有方法。