在Java中,Class
的isAssignableFrom
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>
类型的变量?
答案 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)。
啊,问题的答案是:拥有这样的替代方案应该是不正确的。