2015-11-01 79 views
0

这里是我的示例代码:为什么铸造不能像我所期望的那样在这里工作?

public class Bar extends Foo { 
} 

@SuppressWarnings("unchecked") 
public class Foo { 

    public static void main(String[] args) { 
     Foo foo = new Bar(); 
     Class<Foo> x = (Class<Foo>) foo.getClass(); 
     System.out.println(x); 
    } 
} 

那么我期待这个程序的输出是:让Foo.class因为我铸造类,但是我在输出中看到:

class Bar 

为什么?

如果我从代码中删除铸件,程序甚至不会编译:

java: incompatible types 
required: java.lang.Class<Foo> 
found: java.lang.Class<capture#1 of ? extends Foo> 

为什么编译器逼着我投?

+0

@RealSkeptic这些问题是如何相同的? –

+0

好了,一个'一'不是一个''即使有X'和'Y,'之间的某种联系'这就是为什么你不能从一个''类分配给一个'类'。这是这个问题的要点,也是你问题的要点。 – RealSkeptic

回答

1

为什么?

因为类的对象是Bar,不Foo(你new Bar()创建的对象),你已经明确要求对象它是什么类。你有一个Foo参考对象,但是这并不改变对象实际是什么。

如果我删除铸件从代码,程序甚至不会编译:

这是无关的Foo/Bar事情。您已提供x特定类型(Class<Foo>),但Object#getClass的输入为Class<?>


从您的评论:

是很好,我问对象本身,但后来我把它套管为Class<Foo>,并存储在“X”的数据。这是混淆了我..

铸造具有在对象上没有任何影响,铸造纯粹是有关更改参考你有对象的类型。这是同一个对象,保持不变,你所做的只是改变你引用的类型。这可以改变你所访问的对象的哪些方面,并且如果你试图将对象转换为对象,那么可以(当然)失败。

+0

是的,我问了这个对象本身,但后来我把它放到了一个类并将数据存储在'x'中。这让我很困惑.. –

+1

投射不会改变物体的类型。将一只被称为动物的老鼠投掷到大象,不会将老鼠变成大象。它会失败,因为鼠标不是大象。只要动物确实是大象,将动物铸造成大象就是有效的。您的演员阵容不会因为泛型被删除而失败:在运行时,Java无法从类中删除类。但是你的编译器警告你这是一个不安全的表演:它不能检查这个类是否确实是一个类。如果可以的话,演员阵容将失败。 –