简体   繁体   English

Java泛型-子类型检查?

[英]Java Generic - subtypes check?

How do I check generic subtypes passed as parameter? 如何检查作为参数传递的通用子类型?

For example: 例如:

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

Is it possible? 可能吗? What part I am not understanding? 我不了解哪一部分?

It is not possible because generic type information like that is erased and not available at runtime. 这是不可能的,因为这样的通用类型信息已删除并且在运行时不可用。 At runtime, all that is known is that the parameter to checkparam is a List . 在运行时,只知道checkparam的参数是List

I don't believe you can do it directly on the list. 我不认为您可以直接在清单上进行操作。 You could do a check on the first element: 您可以检查第一个元素:

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

Not pretty and won't work on empty lists, but should work otherwise. 不漂亮,不能在空列表上使用,但应该可以使用。

This is made clear by trying to compile the following code: 通过尝试编译以下代码可以清楚地看出这一点:

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

which produces the following output from javac: 从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