我正在查看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
的新类,就像在英语情况下一样,只是这次是匿名的(您永远都不会给它起一个名字)。当您需要一次性实现接口时,这只是方便的快捷方式。