我无法理解有关Java教程这一部分的一些代码片段:http://docs.oracle.com/javase/tutorial/java/IandI/interfaceAsType.html
public Object findLargest(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;
Relatable obj2 = (Relatable)object2;
if ((obj1).isLargerThan(obj2) > 0)
return object1;
else
return object2;
}
和
public interface Relatable {
// this (object calling isLargerThan)
// and other must be instances of
// the same class returns 1, 0, -1
// if this is greater than,
// equal to, or less than other
public int isLargerThan(Relatable other);
}
答案 0 :(得分:1)
您将Objects
转换为Relatable
类型,因为否则您无法使用Relatable
接口中声明的方法。由于Object
没有isLargerThan
方法,会导致编译错误而不会强制转换。
老实说,在我看来,这里显示的findLargest
方法设计得不是很好;更好地说明接口的目的是要求Relatable
个对象作为参数,如下所示:
public Object findLargest(Relatable object1, Relatable object2) {
//implementation not shown to save space
}
这样,用户必须传递Relatable
个对象,但是它们可以传递任何类实现Relatable
的对象(例如Rectangle
)
"如果我知道我正在比较两个Rectangle对象..."
如果您知道要比较两个Rectangle对象,接口的用处很少,但是接口的目的是允许你创建一个通用的"类型"可用于定义多个不同类的共同特征的对象。
例如,如果您还有Circle
类和Square
类,该怎么办? (两者都实现了Relatable
)?在这种情况下,您不一定知道完全类型的对象,但您会知道它是Relatable
,所以最好是转换为Relatable
类型,并在这种情况下使用isLargerThan
方法。
答案 1 :(得分:0)
接口定义了一组方法,接口实现的每个类都必须实现这些方法。向下转换是访问这些方法所必需的。
您不知道是否要将矩形与此界面进行比较。你可以通过任何Relatble
。这是仿制药派上用场的其中一个案例。
答案 2 :(得分:0)
1.在第一个例子中,为什么我要将Object类型转换为Relatable类型?如果第一种方法不包含前两个语句会怎样?
答案
每个对象都有一些基本功能,您希望现在可以写入特定对象。您正在将对象转换为“Relatable”,因此您可以使用“isLargerThan”方法(一个对象不会拥有它,因为它只有基本的常见内容)。
如果你没有强制转换,你就不会通过编译。
2.假设我写了一个Rectangle类,它实现了Relatable接口并具有“findLargest”方法。如果我知道我正在比较两个Rectangle对象,为什么不让第一个方法将对象转换为Rectangles呢?
答案
因为你想创造一些通用的东西。
假设您有学生和司机。他们都是人。您可以创建一个名为IPeople的接口,让学生和驱动程序实现它。
IPeople会有一个名为“getAge()”的方法,每个方法都会实现。
人们将拥有“人物”所需的所有功能。这就是你在“同一个帽子”下创建交叉对象功能的方式。