2015-11-01 125 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無法從類中刪除類。但是你的編譯器警告你這是一個不安全的表演:它不能檢查這個類是否確實是一個類。如果可以的話,演員陣容將失敗。 –

相關問題