Java 代码似乎正在实例化一个未实现的接口
我已经读过一些关于实例化接口的问题,但要么没有一个解决我的问题,要么我没有完全理解发生了什么Java 代码似乎正在实例化一个未实现的接口,java,interface,Java,Interface,我已经读过一些关于实例化接口的问题,但要么没有一个解决我的问题,要么我没有完全理解发生了什么 Observer observer = (Observer) observers.elementAt(i); 我从未遇到过这样的说法。看起来像是一种奇怪的实例化对象的方式。但是,观察者是一个接口,并且该语句所用的类(类是抽象的,如果有任何关系)没有实现接口 有人能给我解释一下到底发生了什么吗?首先,它没有实例化任何东西,它只是从一个集合中获取了一个Observer实现的实例(我假设它是Vector,方
Observer observer = (Observer) observers.elementAt(i);
我从未遇到过这样的说法。看起来像是一种奇怪的实例化对象的方式。但是,观察者
是一个接口
,并且该语句所用的类(类是抽象的
,如果有任何关系)没有实现接口
有人能给我解释一下到底发生了什么吗?首先,它没有实例化任何东西,它只是从一个集合中获取了一个
Observer
实现的实例(我假设它是Vector
,方法名)
这就是发生的事情
Vector observers = new Vector();
observers.add(new ObserverImpl());
Observer o = (Observer) observers.elementAt(0);
请注意,这是一种非常古老的做法,您不应该再使用Vector
,您应该始终使用泛型,因此应将此代码重写为
List<Observer> observers = new ArrayList<>();
observers.add(new ObserverImpl());
Observer o = observers.get(0); //you don't need to cast anymore because of generics
List observer=new ArrayList();
add(newobserver impl());
观察者o=观察者。获取(0)//由于泛型,您不再需要强制转换
该语句正在从某种集合中检索对象。对象被显式转换为类型Observer
,并分配给Observer
变量。对象没有被实例化,只是被检索。显式强制转换使该语句有点危险,因为无法保证从集合中检索的对象实现观察者接口是一种契约类型,可确保在该接口上定义的方法得到实现。如果一个对象实现了一个接口,那么它必须满足在它上面定义的所有方法
在代码示例中,对象被强制转换为类型为Observer
的变量,这意味着您可以调用任何Observer方法。它不会改变对象,也不会实例化。首先,抽象类是无法实例化的类,有时只有一个方法是抽象的,有时整个类是抽象的。你必须扩展这样一个类。它允许您在基类中实现功能
接口是类的契约,通过关键字implements
实现。它为您提供方法调用,接口中没有功能性
现在谈谈你的问题:
Observer observer = (Observer) observers.elementAt(i);
这确保了对象(包含equals、hashCode或toString等方法)具有接口的方法
public class Cat implements Animal {
public void eat() {
System.out.println("Cat eats Mouse.");
}
}
public class Horse implements Animal {
public void eat() {
System.out.println("Horse eats hay.");
}
}
伪代码中的ex:
interface Printable{
String print();
}
及其“实施”:
及其用途
Printable doc = new MyDocument(); // now we ensure that we can call .print()
接口是与其实现类的契约。编写遇到的代码是完全合法的。
让我们用一个简单的例子来理解这一点:
创建一个界面动物
public interface Animal {
public void eat();
}
创建实现此接口的两个实现类,即Horse和Cat
public class Cat implements Animal {
public void eat() {
System.out.println("Cat eats Mouse.");
}
}
public class Horse implements Animal {
public void eat() {
System.out.println("Horse eats hay.");
}
}
现在使用Tesy类测试行为:
public class Test {
public static void main(String[] args) {
Horse h = new Horse();
Cat c = new Cat();
Animal a = (Animal)h;
a.eat();
a = (Animal)c;
a.eat();
}
}
产出将是:
Horse eats hay.
Cat eats Mouse.
这种行为支持动态多态性或运行时多态性。
即使您有Animal object的引用,您也会持有实现这些方法的马或猫的对象,以便您可以调用它们。持有实现它的类的对象的Animal引用只能调用接口Animal中声明的那些方法。您说该语句是从某种集合中检索对象吗?我假设你是从观察员那里打电话的。elementAt(I)
?这个例子使用的是Vector
(我知道它已经过时了,我只是想跟着一些代码看看发生了什么)。我不确定我是否理解一个对象是如何没有被实例化的。我认为它正在创建一个类型为observer的变量,因此正在实例化它。否?我以前从未遇到过铸造。从你们所说的和我所读到的我所理解的,它是创建一个类型为observer的变量,然后将它转换为类型observer?或者它正在将它从集合中提取的内容转换为类型observer?是的,在某个点上,一个对象正在被实例化并放置到向量中,但它的类型不是observer。但是,该类型确实实现了observer接口,或者很有希望,因为无法保证向量中的项实现了observer接口。存在一个observer接口,并且可以将对象强制转换为接口。您永远不能实例化接口。您只能实例化实现接口的对象。