为什么施法不像我期望的那样在这里工作?

时间:2015-11-01 13:34:44

标签: java class casting

以下是我的示例代码:

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 但是我在输出中看到了:

class Bar

为什么?

如果我从代码中删除了转换部分,程序甚至不会编译:

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

为什么编译器强迫我施放?

1 个答案:

答案 0 :(得分:1)

  

为什么?

因为对象的类是Bar,而不是Foo(您使用new Bar()创建了对象),并且您已明确要求对象它是什么类。您对该对象有Foo 引用,但这并不会改变对象的实际内容。

  

如果我从代码中删除了转换部分,程序甚至不会编译:

这与Foo / Bar事物无关。您已为x提供了特定类型(Class<Foo>),但Object#getClass已键入Class<?>

来自你的评论:

  

是的,我问对象本身,但后来我把它改为Class<Foo>并将数据存储在&#39; x&#39;中。这让我感到困惑..

转换对对象完全没有影响,转换纯粹是关于改变对象的引用的类型。它是同一个对象,没有改变,你所做的只是改变你对它的引用类型。这可以改变你有权访问的对象的哪些方面,并且如果你试图转换为对象不是什么的话,当然可以失败。