2010-10-28 42 views
1

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

例如:

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

这可能吗?我不理解什么?

回答

1

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

+0

我是这么认为的:) – newtoflex4 2010-10-28 15:38:04

0

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

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的输出如下:

+0

就是这么做的..但编译器向“(列表)params”提示“类型安全性:从列表>未列出的列表”中发出警告。 – newtoflex4 2010-10-28 15:40:09

+0

这不是一个真正可行的选择。例如,如果有另一个名为'AOt​​herString'的A '的实现,并且该列表实际上是一个'List >',其中包含一些?如果您尝试将每个'A '都投射到'AString',它会失败。如果它实际上是一个'List >',那里有'ADate'呢? – ColinD 2010-10-28 15:42:10

0

这是通过试图编译下面的代码明确

$ 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