是否有类型对象可以替代Class.isAssignableFrom?

在Java中, Class有一个isAssignableFrom方法,定义如下:

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 s而不仅仅是Class es? 例如,是否有一种方法可以确定类型为List<String>的变量(可以通过ParameterizedType的实例表示)是否可以分配给类型为List<? extends Object>的变量List<? extends Object> List<? extends Object>


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


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

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

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

boolean isAssignable = objectList.isAssignableFrom( stringList );

你可以在任何List <...> - 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)。

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

链接地址: http://www.djcxy.com/p/9859.html

上一篇: Is there an alternative to Class.isAssignableFrom that works with Type objects?

下一篇: Can I customize AvalonDock context menu?