Java转换为类的接口

The*_*One 5 java casting interface class

我有一个关于接口和类实现接口的问题.

这是我的代码:

interface iMyInterface {
    public iMethod1();
}

public class cMyClass implements iMyInterface {
    public iMethod1() {
        // some code
    }
    protected iMethod2() {
        // some code
    }
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个如下的实例iMyInterface:

iMyInterface i = new cMyClass();
i.iMethod1();
Run Code Online (Sandbox Code Playgroud)

没关系,但我如何iMethod2()从我的界面实例调用?这是否有效且安全:

((cMyClass)i).iMethod2();
Run Code Online (Sandbox Code Playgroud)

感谢帮助.

Jon*_*eet 11

是的,就可以了(如果你改变的声明cMyClass来实现iMyInterface),并作为参考真的很安全,只要参考的实例cMyClass.

然而,这通常是个坏主意.使用接口的全部意义是能够使用任何实现 - 它将抽象与实现分开.如果您当时需要特定的实现,那么您也可以选择icMyClass开始的类型.

因此,假设您不是cMyClass自己调用构造函数,而是接收类型的方法参数iMyInterface- 此时转换为一个坏主意cMyClass,因为它可能是接口的不同实现.

(另一方面,最好开始遵循Java命名约定,它规定类和接口应该是Pascal-cased - 所以抛弃前缀ci前缀.)

  • 我认为,如果他要进行强制转换,他应该使用“instanceof”来验证强制转换,以确保安全。 (2认同)