我对接口和类实现接口有疑问。
这是我的代码:
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大小写-因此,请省略c
and i
前缀。)
我有一个界面,看起来像 公共接口密钥检索器{ } 我希望实现是这样的 CustomerTypeKeyRetriever(实现类) 我该如何实现这一点。目前它抛出一个编译错误——“类型CustomerTypeKeyRetriever必须实现继承的抽象方法KeyRetriever.getKey(Object)”
问题内容: 有人可以向我解释一下,编译器在第一次强制转换时不会抱怨,而在第二次强制转换时会抱怨吗? 问题答案: 在和一起使用时,您告诉编译器该对象的类实际上是其声明类型的子类,并且该子类实现。 该班是 最后的 ,所以不可能是一个子类的实例:编译器知道你在说谎。但是不是最终的,所以 可以 是该Implements 的子类型的实例。 如果您使用final,编译器也会抱怨:
问题内容: 我很好奇为什么Go 不会隐式转换为,而Go 会隐式转换为。我缺少这种转换的重要内容吗? 例: 抱怨 不能在函数参数中使用(类型[]字符串)作为类型[] interface {} 如果我尝试明确执行此操作,则会遇到同样的事情:抱怨 无法将(类型[]字符串)转换为类型[] interface {} 因此,每次我需要进行这种转换时(这似乎很多),我一直在做这样的事情: 是否有更好的方法来执行
问题内容: 有人可以启发我为什么我没有得到这个片段吗?我对为什么它不能按我预期的那样非常感兴趣。我现在不在乎这是否是不好的设计。 这是Java版本,编译和运行输出: 问题答案: 类型擦除:泛型仅是一种语法功能,编译器将其删除(出于兼容性原因),并 在需要时 用强制转换代替。 在运行时,该方法不知道类型(这就是为什么无法实例化的原因)。的调用实际上是的调用。之所以被转换为,是因为无边界类型的擦除是(
问题内容: 我正在尝试在Java中使用lambda和流,但我对此很陌生。当我尝试创建lambda表达式时,我在IntelliJ中收到了此错误“ lambda转换的目标类型必须是接口” 难道我做错了什么? 问题答案: 我怀疑这只是Java的类型推断不够聪明。尝试