繁体   English   中英

Java泛型-子类型检查?

[英]Java Generic - subtypes check?

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

例如:

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

可能吗? 我不了解哪一部分?

这是不可能的,因为这样的通用类型信息已删除并且在运行时不可用。 在运行时,只知道checkparam的参数是List

我不认为您可以直接在清单上进行操作。 您可以检查第一个元素:

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

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM