[英]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.