什么时候可以将某个对象转换为另一个对象?强制转换的对象必须是另一个对象的子类型吗?我在试着弄清楚规则...
编辑:我意识到我根本没有解释我的问题:基本上我是将一个对象转换为一个接口类型。但是,在运行时,我会得到一个java.lang.ClassCastException
。需要对我的对象做些什么才能将它强制转换到这个接口?它必须实现它吗?
谢谢
发布于 2010-02-10 09:59:51
在Java中,有两种类型的引用变量类型转换:
是,您需要直接或间接地实现接口,才能将您的类对象引用分配给接口类型。
发布于 2016-12-23 17:47:04
假设我们想将d个对象强制转换为A,
A a= (C)d;
所以在内部,编译器和JVM已经检查了3条规则。JVM编译器在编译时检查前2个规则,将在运行时检查最后一个规则。
规则1(编译时检查):
'd‘和C的
类型必须有某种关系(子类型到父类型或者父类型对子类型或同时).If如果没有关系,那么我们将得到一个编译错误(不可转换的类型)。
规则2(编译时检查):
'C‘必须是'A’的相同类型或派生类型(子类),否则将出现编译错误(类型不兼容)。
规则3(运行时例外):
“%d”的
运行时对象类型必须相同或派生为“C”类型,否则将出现运行时异常(ClassCastException异常)。
找到下面的例子来获得更多的想法,
String s = new String("hello"); StringBuffer sb = (StringBuffer)s; // Compile error : Invertible types because there is no relationship between.
Object o = new String("hello"); StringBuffer sb = (String)o; // Compile error : Incompatible types because String is not child class of StringBuffer.
Object o = new String("hello"); StringBuffer sb = (StringBuffer)o; // Runtime Exception : ClassCastException because 'o' is string type and trying to cast into StingBuffer and there is no relationship between String and StringBuffer.
发布于 2010-02-10 19:36:23
这将会起作用:
class Foo implements Runnable {
public void run() {}
}
Foo foo = new Foo();
System.out.println((Runnable) foo);
但这不会:
class Bar {
public void run() {}
}
Bar bar = new Bar();
System.out.println((Runnable) bar);
因为尽管Bar
有一个可以实现Runnable.run()
的run()
方法,但Bar
没有声明为实现Runnable
,因此不能强制转换为Runnable
。
Java要求您按名称声明已实现的接口。与Python和Go等其他语言不同,它没有duck typing
https://stackoverflow.com/questions/2233902
复制相似问题