使用Java进行转换(接口和类)

如果:

interface I{} class A implements I{} class B extends A{} class C extends B{} A a = new A(); B b = new B(); Why a = (B)(I)b; is correct but b = (B)(I)a; is false? 

我发现施法很混乱,如果我可以向下施放或向上施放物体,最好的方法是什么?

您的类层次结构如下所示:

C  -/> B  – > A  – >我”></p>
<p> 如果<code>x</code>运行时类型是<code>Y</code>子类,则对象<code>x</code>可以转换为类<code>Y</code> 或者,换句话说,如果存在从运行时类型<code>x</code>到<code>Y</code>的路径。  “运行时类型”是指对象的类型(构造对象时使用的对象),而不是变量类型(来自变量声明的对象)。 </p>
<p> 这是有效的: </p>
<pre> <code>b = new B(); (B)(I)b;</code> </pre>
<p> 存储在<code>b</code>对象具有类型<code>B</code> 它被铸造给<code>I</code> ,然后回到<code>B</code>  <code>B</code>是它们的子类。 施展到<code>I</code>实际上并没有做任何事情,只是为了让你感到困惑。 </p>
<p> 但是,这些都不是有效的: </p>
<pre> <code>a = new A(); (B)(I)a; (B)a;</code> </pre>
<p> 它们都会因exception而失败: <code>java.lang.ClassCastException: A cannot be cast to B</code>  <code>a</code>具有类型<code>A</code> ,它不是<code>B</code>的子类。  <code>A</code>和<code>B</code>之间存在关系,但它是相反的方向 – <code>B</code>是<code>A</code>的子类。 </p>
<p> 有关更详细的说明,请参阅此处: http : //docs.oracle.com/javase/tutorial/java/IandI/subclasses.html </p>

</div><!-- #comment-## -->
<div class=

与您的编码示例中回答问题相关的唯一事项如下:

 class B extends A{} 

这意味着B是A的子类。子类可以转换为超类类型,但超类不能转换为子类类型。

因此,A不能转换为B类。

为什么? 以这种方式思考逻辑:

在此处输入图像描述 是一种Programming_language ,但Programming_language不是一种类型 在此处输入图像描述