有人可以向我解释一下,编译器在第一次强制转换时不会抱怨,而在第二次强制转换时会抱怨吗?
interface I1 { }
interface I2 { }
class C1 implements I1 { }
class C2 implements I2 { }
public class Test{
public static void main(){
C1 o1 = new C1();
C2 o2 = new C2();
Integer o3 = new Integer(4);
I2 x = (I2)o1; //compiler does not complain
I2 y = (I2)o3; //compiler complains here !!
}
}
在o1
和o3
一起使用时(I2)
,您告诉编译器该对象的类实际上是其声明类型的子类,并且该子类实现I2
。
该Integer
班是 最后的 ,所以o3
不可能是一个子类的实例Integer
:编译器知道你在说谎。C1
但是不是最终的,所以o1
可以 是C1
该Implements 的子类型的实例I2
。
如果您使用C1
final,编译器也会抱怨:
interface I1 { }
interface I2 { }
final class C1 implements I1 { }
class C2 implements I2 { }
public class Test{
public static void main(){
C1 o1 = new C1();
C2 o2 = new C2();
Integer o3 = new Integer(4);
I2 y = (I2)o3; //compiler complains here !!
I2 x = (I2)o1; //compiler complains too
}
}
问题内容: 我对接口和类实现接口有疑问。 这是我的代码: 我想创建一个这样的实例: 可以,但是如何从接口实例中调用?这是安全的吗? 感谢帮助。 问题答案: 是的,就可以了(如果你改变的声明来实现),并作为参考真的很安全,只要 不 参考的实例。 但是,这通常是个坏主意。使用接口的全部目的是能够与 任何 实现一起使用- 它是将抽象与实现分开。如果你然后将需要一个具体的实现,你还不如让的类型正好与开始。
问题内容: 如果我们将一个对象强制转换为接口,该对象将无法调用其自己的方法吗?在下面的示例中,将只能调用MyInterface方法吗? 如果正确,那么这两个对象之间有什么区别: 谢谢你的帮助 问题答案: 对于这是合法的,都和将要成为执行者。这两个对象之间的区别在于它们 如何 提供该实现。并且可以做两个非常不同或非常相似的事情,但是它们的共同点是它们会遵守您可以依赖的合同。考虑你有办法 可以将每个对
和往常一样,我在浏览JDK8源代码时发现了非常有趣的代码: 问题是:如何可能是的实例?因为它们处于不同的层级。 我做了类似的代码片段来测试转换:
为什么它这样做,它有一个更好的做法?在sub接口中实现方法有什么区别吗?
问题内容: 大多数OO语言的接口名称都以大写的I开头,为什么Java不这样做呢?不遵守该公约的理由是什么? 为了说明我的意思,如果我想拥有一个用户界面和一个用户实现,那么在Java中有两种选择: 类=用户,接口= UserInterface 类= UserImpl,接口=用户 在大多数语言中: 类=用户,接口= IUser 现在,你可能会争辩说,你总是可以为用户实现选择一个最具描述性的名称,问题就
我被告知Java中的标记接口是一个空接口,用于向编译器或JVM发出信号,表明实现此接口的类的对象必须以特殊方式处理,如序列化、克隆等。 但是最近我了解到,它实际上与编译器或JVM无关。例如,在< code>Serializable接口的情况下,< code>ObjectOutputStream的方法< code>writeObject(Object)执行类似于< code > instance o