当前位置: 首页 > 面试题库 >

Java类的转换接口

王骏
2023-03-14
问题内容

我对接口和类实现接口有疑问。

这是我的代码:

interface iMyInterface {
    public iMethod1();
}

public class cMyClass implements iMyInterface {
    public iMethod1() {
        // some code
    }
    protected iMethod2() {
        // some code
    }
}

我想创建一个这样的实例iMyInterface

iMyInterface i = new cMyClass();
i.iMethod1();

可以,但是如何iMethod2()从接口实例中调用?这是安全的吗?

((cMyClass)i).iMethod2();

感谢帮助。


问题答案:

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

但是,这通常是个坏主意。使用接口的全部目的是能够与 任何 实现一起使用-
它是将抽象与实现分开。如果你然后将需要一个具体的实现,你还不如让的类型i正好cMyClass与开始。

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

(另外,最好遵循Java命名约定,该约定指出类和接口应使用Pascal大小写-因此,请省略cand i前缀。)



 类似资料:
  • 我有一个界面,看起来像 公共接口密钥检索器{ } 我希望实现是这样的 CustomerTypeKeyRetriever(实现类) 我该如何实现这一点。目前它抛出一个编译错误——“类型CustomerTypeKeyRetriever必须实现继承的抽象方法KeyRetriever.getKey(Object)”

  • 问题内容: 有人可以向我解释一下,编译器在第一次强制转换时不会抱怨,而在第二次强制转换时会抱怨吗? 问题答案: 在和一起使用时,您告诉编译器该对象的类实际上是其声明类型的子类,并且该子类实现。 该班是 最后的 ,所以不可能是一个子类的实例:编译器知道你在说谎。但是不是最终的,所以 可以 是该Implements 的子类型的实例。 如果您使用final,编译器也会抱怨:

  • 问题内容: 我很好奇为什么Go 不会隐式转换为,而Go 会隐式转换为。我缺少这种转换的重要内容吗? 例: 抱怨 不能在函数参数中使用(类型[]字符串)作为类型[] interface {} 如果我尝试明确执行此操作,则会遇到同样的事情:抱怨 无法将(类型[]字符串)转换为类型[] interface {} 因此,每次我需要进行这种转换时(这似乎很多),我一直在做这样的事情: 是否有更好的方法来执行

  • 问题内容: 有人可以启发我为什么我没有得到这个片段吗?我对为什么它不能按我预期的那样非常感兴趣。我现在不在乎这是否是不好的设计。 这是Java版本,编译和运行输出: 问题答案: 类型擦除:泛型仅是一种语法功能,编译器将其删除(出于兼容性原因),并 在需要时 用强制转换代替。 在运行时,该方法不知道类型(这就是为什么无法实例化的原因)。的调用实际上是的调用。之所以被转换为,是因为无边界类型的擦除是(

  • 问题内容: 我正在尝试在Java中使用lambda和流,但我对此很陌生。当我尝试创建lambda表达式时,我在IntelliJ中收到了此错误“ lambda转换的目标类型必须是接口” 难道我做错了什么? 问题答案: 我怀疑这只是Java的类型推断不够聪明。尝试