Java 是否有可用于类型对象的Class.isAssignableFrom的替代方案?

Java 是否有可用于类型对象的Class.isAssignableFrom的替代方案?,java,reflection,Java,Reflection,在Java中,有一个定义如下: 公共布尔值isAssignableFrom(类cls) 确定此类对象表示的类或接口是否与指定的类参数表示的类或接口相同,或者是该类或接口的超类或超接口。如果是,则返回true;否则它将返回false。如果此Class对象表示基元类型,则如果指定的Class参数正是此Class对象,则此方法返回true;否则它将返回false 具体地说,此方法测试指定的类参数表示的类型是否可以通过标识转换或扩展引用转换转换为该类对象表示的类型。有关详细信息,请参阅Java语言规范

在Java中,有一个定义如下:

公共布尔值isAssignableFrom(类cls)
确定此
对象表示的类或接口是否与指定的
参数表示的类或接口相同,或者是该类或接口的超类或超接口。如果是,则返回
true
;否则它将返回
false
。如果此
Class
对象表示基元类型,则如果指定的
Class
参数正是此
Class
对象,则此方法返回
true
;否则它将返回
false

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

参数:
cls
-要检查的
对象

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


Class
实现
Type
接口。是否有一个等效的
isAssignableFrom
方法可以在
类型
s上工作,而不仅仅是
es?例如,是否有一种方法可以确定
List
类型的变量(可以通过的实例表示)是否可以分配给
List类型的变量。请看一看--我发现它很有用。它可以从
java.lang.reflect.Type的实例中生成类型的表示,并测试它们之间的可分配性。

您可以在任何列表之间强制转换,保护比正常情况下弱

试试这个

    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));
您将获得ClassCastException,因为编译时确定的println函数版本将是println(字符串arg)

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

Guava的实用程序提供了这种功能。您的问题可以这样回答:

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

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

boolean isAssignable = objectList.isAssignableFrom( stringList );
//表示列表
ParameteredType stringList=。。。;

//也许我不清楚。我有两个
类型
对象,我想知道第一个
类型
的假设变量理论上是否可以从第二个
类型
的另一个假设变量中赋值。我已经知道了类型擦除。不过,谢谢你。:)您可能可以深入研究像guice/cdi/spring这样必须在内部处理类型算法的框架。它能确定
List
List
的一个子类型吗?是,给定一个
org.javaruntype.type.type
s
表示
List
和一个
org.javaruntype.type.type
表示
List
,它对
t.isAssignableFrom(s)
回答
true
           System.out.println(a.get(0));
// represents List<String>
ParameterizedType stringList = ...; 

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

boolean isAssignable = objectList.isAssignableFrom( stringList );