如何检查作为参数传递的通用子类型?
例如:
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> ?
}
有可能吗?我不理解哪一部分?
答案 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