接口类对象,铸造,异常

时间:2014-11-06 19:16:39

标签: java object interface casting

我看到了这段代码:

interface I{}    

class A implements I{}

class B extends A{}

class C  extends B{}

class ABC
{

    public static void main(String args[])
    {
      A a=new A();
      B b=new B();              
      a=(B)(I)b;  //Line 1
      b=(B)(I)a;  //Line 2
      a=(I)b;     //Line 3
      I i=(C)a;  //Line 4
    }
}

试图找出

  1. 具有安全转换的方式,即没有编译时间或运行时错误
  2. 在什么情况下,cast会显示编译时错误
  3. 在什么情况下,施法将显示运行时异常
  4. 任何人都可以向我解释这三个概念吗?

1 个答案:

答案 0 :(得分:0)

在java中,类似于类的接口是一种类型。在你的例子中,A类的对象属于A类,属于I类.B类的对象是B型,类型(子类型)A和类型I.C类的对象是C型,类型(子类型)B,类型(子类型)A和类型I.注意,对象是两种类型的类型(两种类型没有相互链接,即A和I是独立的类型)和它们各自超类的子类型。

根据Leskov的替换委托人,您可以代替超类型(超类)来获得子类型(子类)。为了说明下面的代码片段:

public class InheritanceTest {

public interface I{}
public class A implements I{}
public class B extends A{}
public class C extends B{}
public class D implements I{}
public class E{}

public void method(){

    A a=new A();
    B b=new B();
    C c=new C();

    D d=new D();

    I i=null;

    i=a;i=b;i=c;

    a=b;
    b=c;
    a=c;

    a=(A)i;//a=i does not work, A and I are two different types

    i=d;
    a=(A)i;//ClassCastException at runtime, D is not an A

    E e=new E();
    //a=(A)e; - this generates a compile time error

}//method closing

} //关闭课程

强制转换是必要的,因为根据代码,所有As都是Is但是所有Is都不是因为我可以有一个D类实现了我但是完全没有连接到A继承层次结构。一般情况下,当你必须在两个未连接的类型之间进行转换时,你需要进行转换。

注意:我已编辑代码以包含另一个D类 注意:我已编辑代码以包含另一个类E