java - Java中如何判断一个Type是否实现了某个接口(interface)?

标签 java types interface casting

这似乎很容易,但我现在几天都无法解决它......我一定是太笨了,所以我希望在这里得到一些帮助(虽然找不到答案)。

我只是想知道给定的类型是否实现了某个接口(interface)。例如,类型 X 是否实现了 Serialized 接口(interface)?它应该为 JComponent.class 等 X 类型提供 true,为 Thread.class 提供 false。

或者,换句话说,类型 X 的对象可以转换为给定的接口(interface)吗?

我尝试了 instanceofisAssignableFrom,但似乎没有任何效果。

编辑:

好吧,也许我真的太愚蠢了:-(我已经尝试过以下方法:

此代码无法编译:

    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);

作为实现接口(interface)的类型应该始终是一个类(对吗?),转换应该在所有情况下都有效...(编辑:有一个更简单的解决方案 - 我使用了检索构造函数参数的方法错误 (getGenericParameterTypes);仅使用 getParameterTypes 会给出 Class 对象列表而不是 Type 对象,并且完全没有问题。)

感谢您的快速帮助!

卢卡斯

最佳答案

不,instanceofisAssignablefrom() 都可以工作。尝试以下示例:

List<String> list = new ArrayList<>(); // it is serializable
System.out.println(list instanceof Serializable); // should print true
System.out.println(Serializable.class.isAssignableFrom(list.getClass())); // should print true too

编辑

关于第二个问题。是的,您可以使用这两种技术来检查对象是否可以强制转换。

关于java - Java中如何判断一个Type是否实现了某个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24547856/

相关文章:

c# - 从共享某些部分的 2 个接口(interface)实现一个类

java - 连接到 Ldap

javascript - 如何使用附加属性扩展 Flow 函数类型

c# - 错误 : is a 'field' but is used like a 'type' c#

Java:强制实现接口(interface)以扩展抽象类

go - 如何在golang中使用接口(interface)反射的类型断言?

java - 不关闭 InputStream 时是否存在内存泄漏?

java - 媒体播放器无法第二次播放

java - Spring @RequestBody 与 GeoJsonPoint

types - 我如何在 Go 中引用接口(interface)类型?