是否有Class.isAssignableFrom替代Type对象?

时间:2011-10-27 17:38:58

标签: java reflection

在Java中,ClassisAssignableFrom method定义如下:

public boolean isAssignableFrom(Class<?> cls)
     

确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口。如果是,它返回true;否则返回false。如果此Class对象表示基本类型,则如果指定的true参数恰好是此Class对象,则此方法返回Class;否则返回false

     

具体来说,此方法测试指定的Class参数表示的类型是否可以通过标识转换或扩展引用转换转换为此Class对象表示的类型。有关详细信息,请参阅Java语言规范,第5.1.1和5.1.4节。

     

参数:

     

cls - 要检查的Class对象

     

返回:

     

boolean值,指示类型cls的对象是否可以分配给此类的对象

Class实现Type接口。是否有一个等效的isAssignableFrom方法适用于Type而不只是Class es?例如,是否有一种方法可以确定类型List<String>的变量(可以通过ParameterizedType的实例表示)是否可以分配给List<? extends Object>类型的变量?

3 个答案:

答案 0 :(得分:2)

看看javaRuntype - 我发现它很有用。它可以从java.lang.reflect.Type的实例生成类型的表示,并测试它们之间的可分配性。

答案 1 :(得分:1)

Guava的TypeToken实用程序提供了该功能。您的查询可以这样回答:

// represents List<String>
ParameterizedType stringList = ...; 

// represents List<? extends Object>
TypeToken objectList = new TypeToken<List<? extends Object>>(){};

boolean isAssignable = objectList.isAssignableFrom( stringList );

答案 2 :(得分:0)

你可以在任何List&lt; ...&gt; -s之间进行投射,保护比正常情况要弱。

试试这个

    List<String> a = new Vector<String>();
    List<Integer> b = new Vector<Integer>();
    Integer i = new Integer(0);

    b.add(2);

    a = (List<String>) (Object) b;

    System.out.println((Object)a.get(0));

不会抛出异常。

这是因为泛型只是编译时的概念。

如果你写

           System.out.println(a.get(0));

你将得到ClassCastException,因为在编译时确定的println函数版本将是println(String arg)。

啊,问题的答案是:拥有这样的替代方案应该是不正确的。