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接口,并且可以将对象强制转换为接口。您永远不能实例化接口。您只能实例化实现接口的对象。