【发布时间】:2015-04-16 15:23:03
【问题描述】:
这是我在 Stackoverflow 上的第一个问题,我希望你能帮助我解决我现在遇到的理解问题。
假设我正在这样做:
Object o = null;
String s = "Test";
System.out.println(o instanceof String); //This returns false
o = s;
System.out.println(o instanceof String); //This returns true
到目前为止一切都很好,但现在当我这样做时:
System.out.println( ((Object) o) instance of String) //Still prints true
那么为什么即使在打印中我将 o 转换回 Object 类,这个语句也会打印出 true 呢?甚至
System.out.println(((Object)o).getClass())
打印出 o 属于 String 类。为什么会这样?
这引出了我的第二个问题,它与泛型和类型擦除有关。 我查看了这样的代码示例:
private static <T> T cast(Object i){
return (T) i;
}
public static void main(String[] args){
Object o = null;
try{
o = main.<Double> cast("Test");
}catch(ClassCastException ex) {
System.out.println("Could not cast properly");
}
System.out.println(o == null); //Prints false
System.out.println(o instanceof String); //Prints true
System.out.println(o instanceof Double); //Prints false
}
根据我对类型擦除的理解,所有泛型 T 将在运行时替换为 Object。运行强制转换功能时,实际上应该发生的事情是
类似于return (Object) i; 的东西。
作为我上面的第一个问题,为什么System.out.println(o instanceof String); 打印为真? o 不应该是 Object 类型吗?
期待您的回答,谢谢:)!
【问题讨论】:
-
Assax91,请重新命名此问题并为您的第二个问题创建第二个问题。问题被分离出来,以帮助为未来的编码人员提供最有用的存档。
-
至少合适的标签都有了……你觉得够了吗?
-
@Choirbean 我认为这个问题很好。这些问题都是相关的。
-
我的目标是将第一个问题作为第二个问题的介绍,因为我认为它们基本上是相同的问题。这是一个更大的问题,分为两部分。那么该怎么走呢?拆分还是保留?
-
我想我在这里被否决了。我会提出两个问题并将第二个问题与第一个问题联系起来,但我不介意犯错。我经常错:)
标签: java casting polymorphism type-erasure