2010-10-28 41 views
1

如何檢查作爲參數傳遞的泛型子類?Java通用 - 子類型檢查?

例如:

public class A<T> { public T get();} 
public class AString extends A<String> {} 
public class ADate extends A<Date> {} 

public void checkparam(List<? extends A<?>> params) { 
///Want to check if params is of type List<AString> or List<ADate> ? 
} 

這可能嗎?我不理解什麼?

回答

1

這是不可能的,因爲這樣的泛型類型信息被擦除並且在運行時不可用。在運行時,所有已知的參數是checkparamList

+0

我是這麼認爲的:) – newtoflex4 2010-10-28 15:38:04

0

我不相信你可以直接在清單上做。你可以檢查第一個元素:

if (!params.isEmpty() && params.get(0) instanceof AString) { 
    // it's List<AString> 
} 
... 

不漂亮,不會在空列表上工作,但應該以其他方式工作。

import java.util.Date; 
import java.util.List; 

public class A<T> { 
    private T value; 

    public T get() { 
     return value; 
    } 

    public void checkparam(List<AString> list) { 

    } 

    public void checkparam(List<ADate> list) { 

    } 
} 
class AString extends A<String> {} 
class ADate extends A<Date> {} 

產生從javac的輸出如下:

+0

就是這麼做的..但編譯器向「(列表)params」提示「類型安全性:從列表>未列出的列表」中發出警告。 – newtoflex4 2010-10-28 15:40:09

+0

這不是一個真正可行的選擇。例如,如果有另一個名爲'AOt​​herString'的A '的實現,並且該列表實際上是一個'List >',其中包含一些?如果您嘗試將每個'A '都投射到'AString',它會失敗。如果它實際上是一個'List >',那裏有'ADate'呢? – ColinD 2010-10-28 15:42:10

0

這是通過試圖編譯下面的代碼明確

$ javac A.java 
A.java:11: name clash: checkparam(java.util.List<AString>) and checkparam(java.util.List<ADate>) have the same erasure 
    public void checkparam(List<AString> list) { 
       ^
A.java:15: name clash: checkparam(java.util.List<ADate>) and checkparam(java.util.List<AString>) have the same erasure 
    public void checkparam(List<ADate> list) { 
       ^
2 errors