我正在查看Java网站上提供的“接口”一章
Using Interface as a type
因此,我的理解是,接口的全部要点是它就像一个类,但无法从中形成对象,但是此页面说明了如何将接口用作数据类型。 Relatable obj1 = (Relatable)object1;行似乎创建了一个Relatable类型的对象,它是一个接口。尽管我必须说此处未使用new关键字,因此实际上并未创建对Relatable类型的对象的引用。这真的是这一行未创建Relatable类型的对象的原因吗?

再次,它进一步说

如果您提出以多种方式实施Relatable的观点
类,从任何这些类实例化的对象都可以是
与findLargest()方法相比-假设两个对象都是
同一 class 的

这是什么意思?这是否意味着任何实现Relatable的东西都可以调用findLargest()?如果是这样,为什么会显示provided that both objects are of the same class

-----编辑-----
从本教程的前几章开始:
相关的定义:

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);
}

使用可关联的类型:
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;
}

-----编辑2 -----
在有关匿名类的章节中,它是这样做的:
public class HelloWorldAnonymousClasses {

    interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }
.
.
.
 HelloWorld englishGreeting = new EnglishGreeting();

        HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };

那么这是如何工作的呢?

最佳答案

行Relatable obj1 =(Relatable)object1;似乎创建一个Relatable类型的对象

否。此行创建类型为Relatable的引用(obj1)并将其分配给object1。为了使它起作用,必须将object1强制转换为(接口)类型Relatable
此处未创建新对象。

这是否意味着实现Relatable的任何对象都可以调用findLargest()?

是。

如果是这样,为什么要提供两个对象属于同一类的原因呢?

它与isLargerThan()的实现有关。由于任何实现Relatable接口的类都不知道其他实现该接口的类,因此它们无法与其他类进行有意义的比较。因此,为了使它起作用,两个对象都必须属于同一类。

对EDIT 2的响应

那么这是如何工作的呢?

而不是像EnglishGreeting那样先定义一个类然后再创建一个实例,而不是动态创建frenchGreeting。幕后情况是,创建了一个实现HelloWorld的新类,就像在英语情况下一样,只是这次是匿名的(您永远都不会给它起一个名字)。当您需要一次性实现接口时,这只是方便的快捷方式。

10-06 05:08