Java:帮助理解接口作为数据类型的用途?

时间:2014-07-26 07:01:50

标签: interface

我无法理解有关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);
}
  1. 在第一个示例中,为什么我将对象类型向下转换为Relatable类型?如果第一种方法不包含前两个语句,会发生什么?
  2. 假设我写了一个Rectangle类,它实现了Relatable接口并且具有" findLargest"方法。如果我知道我要比较两个Rectangle对象,为什么不让第一个方法将对象转换为Rectangles呢?

3 个答案:

答案 0 :(得分:1)

  1. 您将Objects转换为Relatable类型,因为否则您无法使用Relatable接口中声明的方法。由于Object没有isLargerThan方法,会导致编译错误而不会强制转换

    老实说,在我看来,这里显示的findLargest方法设计得不是很好;更好地说明接口的目的是要求Relatable个对象作为参数,如下所示:

    public Object findLargest(Relatable object1, Relatable object2) { //implementation not shown to save space }

    这样,用户必须传递Relatable个对象,但是它们可以传递任何类实现Relatable的对象(例如Rectangle

    < / LI>
  2. &#34;如果我知道我正在比较两个Rectangle对象...&#34;

    如果您知道要比较两个Rectangle对象,接口的用处很少,但是接口的目的是允许你创建一个通用的&#34;类型&#34;可用于定义多个不同类的共同特征的对象

    例如,如果您还有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()”的方法,每个方法都会实现。 人们将拥有“人物”所需的所有功能。这就是你在“同一个帽子”下创建交叉对象功能的方式。