我觉得我应该知道这一点,但当被问到时却无法真正解释。 我有一个方法:
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() 时,我的程序如何知道要做什么?在我的类(class)中,我没有实际实现 IByteConverter 中的代码,但程序按预期工作。有没有一个简单的方法来解释发生了什么?
最佳答案
让我们用另一个例子让事情更容易理解:您定义一个接口(interface) Fruit,它有一个方法 getColor()
。此方法的约定是它返回一种颜色。
根据此约定,您定义一个类,该类采用 Fruit
数组,并计算红色水果的数量。
您不需要任何实现来编译此方法,因为您可以确定唯一可以传递给此方法的是对象数组,这些对象是确实实现了 Fruit
接口(interface)的类。为了使该方法运行,您需要至少定义一个实现 Fruit
接口(interface)的类(例如 Apple
),并构造该类的对象数组。
这就是多态性的全部内容:只要尊重其接口(interface)的约定,您就可以在不知道其实际类是什么的情况下调用对象的方法。
泛型不会让这变得不同。由于 obj
的类型为 T
,并且 T
扩展了 IByteConverter
,因此您可以调用 toByteArray( )
obj
上的方法。
关于java - 基本接口(interface)说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13652763/