2015-10-18 75 views
1

让有下面的类图作为例子接口和Java中的类

enter image description here

我做了Java中类似的类像下面

public class B { 

} 

public interface C { 

} 

public class A extends B implements C { 

} 

public class D { 
    C c = new A(); 
    C c1 = new B(); // Error, Type mismatch: cannot convert from B to C. WHY ? 
    C c2 = (C) new B(); // Works fine. This makes me confuse ... What does this actually mean ? 
} 

任何人能解释一下吗?

+0

为什么我的问题是downvoted? – Junaid

+1

@Junaid忽略那些没有评论的downvotes。 –

回答

0
C c1 = new B(); // Error, Type mismatch: cannot convert from B to C. WHY ? 

您只能通过超类引用来引用派生类。在你的情况下,C是一个不是超类B。因此,错误

C c2 = (C) new B(); // This makes me confuse ... What does this actually mean ? 

编译器不会允许您执行上述转换。为了从一种类型转换到另一种类型,这两个类必须位于相同的对象层次结构中。

1
C c1 = new B() 

你永远不能实例B类为C接口,因为它没有实现接口C.

C c2 = (C) new B() 

在你明确铸造B的实例类型C.编译器的第二个案例允许这一点,但你会得到一个运行时异常。

1

为什么C c2 = (C) new B();不能编译:请参阅Ankur Shanbhag的答案。

C c2 = (C) new B();可编译良好,但由于c2B对象,因此不能被转换为C,这将在运行时抛出异常。

我做了一个例子:

public class D { 
    public static void main(String[] args) { 
     C c2 = (C) new B();   
     System.out.println(c2); 
    } 
} 

并获得了异常:

Exception in thread "main" java.lang.ClassCastException: casting.B cannot be cast to C

0

扩展方式 “是一种”。

A是一种B,所以它具有B的所有功能。

然而,B不是一种A,所以它不一定有A所有功能,包括实现interface C。这就是为什么你的类型不匹配。

但在这种情况下:

C c2 = (C) new B() 

铸造告诉编译器“不检查这个,因为我知道我在做什么。”所以它可以编译。

但是,如果在运行时的对象,你实际上投不能分型为一个C,你会得到一个ClassCastException。在你的情况下,你投了一个BC,而B不是一种C不只是一种A。所以你会得到例外。