1

我知道分配给类型为接口的引用变量的对象可能是实现接口的类的实例。但是对于以下代码块:

public interface foo {
    public abstract void method_1();
}

class bar implements foo {  
    @Overide
    public void method_1() { //Implementation... }

    public void method_2() { //Do some thing... } 
}
.....

foo variable = new bar();
variable.method_1(); // OK;
variable.method_2(); // Is it legal?

是否可以使变量(其声明类型为 foo 但实际类型为 bar)调用未在接口中声明的 方法_2 ?提前致谢!

4

5 回答 5

2

variable.method_2()不会按variable类型编译foofoo没有方法method_2()

于 2013-02-04T17:05:56.990 回答
2

是的,您可以投射:

((bar)variable).method_2();

但你可能不应该。接口的全部意义在于只使用它提供的方法。如果它们还不够,请不要使用该界面。

于 2013-02-04T17:06:11.797 回答
2

不它不是。如果你想访问method_2,你必须声明的类型variablebar

于 2013-02-04T17:06:13.030 回答
1

Is it possible to make the variable (whose declared type is foo but actual type is bar) call the method_2 which is not declared in the interface ?

不是它不可能。这将是一个编译时错误。

您的代码中还有其他标准偏差

  1. 接口和类名应该大写驼峰式(这是 UpperCamelCase)。
于 2013-02-04T17:07:26.580 回答
1

不,这是不合法的。但是,您可以在运行时检查类型并转换为正确的类型:

if (variable instanceof bar) ((bar)variable).method_2();

(严格来说,instanceof如果您确定类型正确,则可以在不检查的情况下进行强制转换,或者如果您错了,很乐意抛出异常。)

于 2013-02-04T17:08:00.060 回答