【发布时间】:2014-08-24 05:34:33
【问题描述】:
这似乎很容易,但我这几天都无法解决它......我一定是太笨了,所以我希望在这里得到一些帮助(虽然找不到答案)。
我只是想知道给定的类型是否实现了某个接口。例如,类型 X 是否实现了Serializable 接口?对于类型 X,如 JComponent.class,它应该给出 true,对于 Thread.class,它应该给出 false。
或者,换一种说法,可以将 X 类型的对象强制转换为给定的接口吗?
我尝试了instanceof 和isAssignableFrom,但似乎没有任何效果。
编辑:
好吧,也许我真的太笨了 :-( 我尝试了以下方法:
此代码无法编译:
Type t1 = JComponent.class;
Type t2 = Thread.class;
Serializable.class.isAssignableFrom(t1);
Serializable.class.isAssignableFrom(t2);
这段代码对 t1 和 t2 都为 true(当然,这是有道理的):
Type t1 = JComponent.class;
Type t2 = Thread.class;
Serializable.class.isAssignableFrom(t1.getClass());
Serializable.class.isAssignableFrom(t2.getClass());
(与 instanceOf 类似的东西也不起作用。)
但似乎有效的是:
Type t1 = JComponent.class;
Type t2 = Thread.class;
Serializable.class.isAssignableFrom((Class<?>) t1);
Serializable.class.isAssignableFrom((Class<?>) t2);
作为实现接口的类型应该始终是类(对吗?),强制转换应该在所有情况下都有效......(编辑:还有一个更简单的解决方案 - 我使用了获取构造函数参数的错误方法(getGenericParameterTypes);仅使用 getParameterTypes 会给出 Class 对象列表而不是 Type 对象,完全没有问题。)
感谢您的快速帮助!
卢卡斯
【问题讨论】:
-
为什么
instanceof和isAssignableFrom()不起作用?据我所知,他们应该工作。你能补充更多细节吗? -
instanceof和isAssignableFrom应该都可以工作。你遇到了什么错误?可以说详细点吗? -
如果一个类型实现了一个接口,你可以在你的代码中访问访问这个方法,所以这是编译器在编译你的程序时知道的,因此对我来说,在运行时发现它是没有意义的。为什么需要检查这个?
-
是的,我应该更具体一些 - 我相信,主要问题是我有一个 Type 对象,而不是要测试的 Class。例如,这很好用: Serializable.class.isAssignableFrom(JComponent.class); Serializable.class.isAssignableFrom(Thread.class);
-
我想通过反射访问它的构造函数来构造一个对象。我想在运行时知道给定类型是否与参数类型匹配,因此我可以将相应的对象发送给构造函数。
标签: java types interface casting