首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于造型的Java规则

用于造型的Java规则
EN

Stack Overflow用户
提问于 2010-02-10 09:53:31
回答 6查看 32.1K关注 0票数 25

什么时候可以将某个对象转换为另一个对象?强制转换的对象必须是另一个对象的子类型吗?我在试着弄清楚规则...

编辑:我意识到我根本没有解释我的问题:基本上我是将一个对象转换为一个接口类型。但是,在运行时,我会得到一个java.lang.ClassCastException。需要对我的对象做些什么才能将它强制转换到这个接口?它必须实现它吗?

谢谢

EN

回答 6

Stack Overflow用户

发布于 2010-02-10 09:59:51

在Java中,有两种类型的引用变量类型转换:

  • Downcasting:如果您有引用某个子类型对象的引用变量,则可以将其赋给该子类型的引用变量。为此,您必须进行显式强制转换,结果是您可以使用这个新的引用variable.
  • Upcasting:访问子类型的成员。您可以显式或隐式地将引用变量分配给父类型引用变量。这是一个本质上安全的操作,因为赋值限制了新变量的访问能力。

,您需要直接或间接地实现接口,才能将您的类对象引用分配给接口类型。

票数 32
EN

Stack Overflow用户

发布于 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异常)。

找到下面的例子来获得更多的想法,

代码语言:javascript
复制
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.
票数 7
EN

Stack Overflow用户

发布于 2010-02-10 19:36:23

这将会起作用:

代码语言:javascript
复制
class Foo implements Runnable {
    public void run() {}
}

Foo foo = new Foo();
System.out.println((Runnable) foo);

但这不会:

代码语言:javascript
复制
class Bar {
    public void run() {}
}

Bar bar = new Bar();
System.out.println((Runnable) bar);

因为尽管Bar有一个可以实现Runnable.run()run()方法,但Bar没有声明为实现Runnable,因此不能强制转换为Runnable

Java要求您按名称声明已实现的接口。与PythonGo等其他语言不同,它没有duck typing

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2233902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档