以下是我的示例代码:
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>
为什么编译器强迫我施放?
答案 0 :(得分:1)
为什么?
因为对象的类是Bar
,而不是Foo
(您使用new Bar()
创建了对象),并且您已明确要求对象它是什么类。您对该对象有Foo
引用,但这并不会改变对象的实际内容。
如果我从代码中删除了转换部分,程序甚至不会编译:
这与Foo
/ Bar
事物无关。您已为x
提供了特定类型(Class<Foo>
),但Object#getClass
已键入Class<?>
。
来自你的评论:
是的,我问对象本身,但后来我把它改为
Class<Foo>
并将数据存储在&#39; x&#39;中。这让我感到困惑..
转换对对象完全没有影响,转换纯粹是关于改变对象的引用的类型。它是同一个对象,没有改变,你所做的只是改变你对它的引用类型。这可以改变你有权访问的对象的哪些方面,并且如果你试图转换为对象不是什么的话,当然可以失败。