代码似乎是在实例化一个未实现的接口

时间:2013-11-18 11:48:56

标签: java interface

我已经阅读了一些关于实例化界面的问题,但是其中一个都没有解决我的问题,或者我没有完全理解发生了什么。

Observer observer = (Observer) observers.elementAt(i);

我从未遇到过这样的陈述。看起来像是一种实例化对象的奇怪方式。但是,Observerinterface,此语句的类(abstract,如果有任何影响),则不会实现interface

有人能向我解释究竟发生了什么吗?

5 个答案:

答案 0 :(得分:3)

该语句正在从某种集合中检索对象。该对象显式转换为类型Observer并分配给observer变量。该对象未被实例化,只是被检索。显式强制转换使得此语句稍微有点危险,因为无法保证从集合实现Observer中检索的对象。

答案 1 :(得分:0)

首先,它没有实例化任何东西,它只是从一个集合中抓取一个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

答案 2 :(得分:0)

接口是一种合同,可确保实现在该接口上定义的方法。如果一个对象实现了一个接口,它必须要满足它上面定义的所有方法。

在您的代码示例中,对象被强制转换为Observer类型的变量,这意味着您可以调用任何Observer方法。它不会改变对象,也不会实例化。

答案 3 :(得分:0)

首先,抽象类是一个无法实例化的类,有时候只有一个方法抽象,有时候整个类都是抽象的。你必须extend这样一堂课。它允许您在基类中实现功能。

接口是类的合约,由关键字implements实现。它为您提供方法调用,接口中没有函数。

现在回答你的问题:

Observer observer = (Observer) observers.elementAt(i);

这确保了一个对象(包含类似:equals,hashCode或toString的方法)具有接口的方法。

ex in pseudocode:

interface Printable{
 String print();
}

及其“实施”:

public class MyDocument implements Printable{

@Override
public String print(){
 // do the print thing
}

public void additionalMethod(){
 // do some other stuff
}
}

及其使用

Printable doc = new MyDocument(); // now we ensure that we can call .print()

答案 4 :(得分:0)

接口是其实现类的合同。编写您遇到的代码是完全合法的。 让我们通过一个简单的例子来理解这一点:

创建一个界面Animal

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对象的引用,你也可以使用Horse或Cat的对象来实现这些方法,这样你就可以调用它们。保存实现它的类的对象的Animal引用只能调用在Animal。接口中声明的那些方法。