2014-09-24 29 views
2

我是新來的泛型,我有一個問題。如何執行選中的演員?

考慮下面的代碼:

public class A {} 
public class B extends A {} 

public <T extends A> T getB() 
{ 
    A test = new B(); 
    Class<B> clazz = B.class; 
    if (clazz.isInstance(test)) 
    { 
     return (T)test; 
    } 
    return null; 
} 

這產生一個未經檢查的投警告。在return (T)test;行。 但很明顯,我正在檢查if (clazz.isInstance(test))行的類型。

有沒有辦法做一個「檢查演員」?

我不是隻想壓制警告,但實際上實現了檢查的演員。不幸的是,我無法找到關於如何執行選中演員的信息。

回答

7

有沒有辦法做一個「檢查演員」?

當然,但值得注意的是,它並沒有真正幫助你在這裏,因爲你的方法是很重要的硬編碼在少數地方使用B。您可以執行轉換:

clazz.cast(test) 

...但是,這將轉換爲B,不T。特別是,假設我跑了:

public class C extends A {} 

... 

C c = foo.<C>getB(); 

你會如何期待這種工作?

您可能要更改您的代碼是這樣的:

public <T extends A> T getB(Class<T> clazz) 
{ 
    A test = // get A from somewhere 
    return clazz.isInstance(test) ? clazz.cast(test) : null; 
} 

那麼這很好,因爲clazz.cast返回T類型的值,你沒事返回。

+0

完美!我的實際代碼已經傳入了一個Class參數。奇怪我錯過了「演員」功能。謝謝! – AllenKll 2014-09-24 18:31:38