Java Generic - 子类型检查?

时间:2010-10-28 15:24:12

标签: java generics

如何检查作为参数传递的通用子类型?

例如:

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> ?
}

有可能吗?我不理解哪一部分?

3 个答案:

答案 0 :(得分:1)

这是不可能的,因为这样的泛型类型信息被擦除并且在运行时不可用。在运行时,所有已知的是checkparam的参数是List

答案 1 :(得分:0)

我不相信你可以直接在名单上这样做。你可以检查第一个元素:

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

不漂亮,不会在空列表上工作,但应该起作用。

答案 2 :(得分:0)

通过尝试编译以下代码可以清楚地看到这一点:

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产生以下输出:

$ 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