如何确定Type是否在Java中实现接口?

时间:2014-07-03 07:43:25

标签: java types interface casting

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

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

或者,换句话说,可以将类型X的对象强制转换为给定的接口吗?

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

修改

好吧,也许我真的太傻了:-(我试过以下几点:

此代码无法编译:

    Type t1 = JComponent.class;
    Type t2 = Thread.class;
    Serializable.class.isAssignableFrom(t1);
    Serializable.class.isAssignableFrom(t2);

此代码对t1和t2都是正确的(当然这是有道理的):

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

作为实现接口的Type应该始终是Class(对吗?),演员应该适用于所有情况......(编辑:有一个更简单的解决方案 - 我使用了用于检索构造函数参数的错误方法(getGenericParameterTypes);仅使用getParameterTypes给出Class对象的列表而不是Type对象,并且根本没有问题。)

感谢您的快速帮助!

的Lukas

2 个答案:

答案 0 :(得分:2)

不,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

修改

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

答案 1 :(得分:0)

object instanceof object_interface将产生真实的