【问题标题】:How to find out if a Type implements an interface in Java?如何找出类型是否在 Java 中实现了接口?
【发布时间】:2014-08-24 05:34:33
【问题描述】:

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

我只是想知道给定的类型是否实现了某个接口。例如,类型 X 是否实现了Serializable 接口?对于类型 X,如 JComponent.class,它应该给出 true,对于 Thread.class,它应该给出 false。

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

我尝试了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);

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

感谢您的快速帮助!

卢卡斯

【问题讨论】:

  • 为什么instanceofisAssignableFrom() 不起作用?据我所知,他们应该工作。你能补充更多细节吗?
  • instanceofisAssignableFrom 应该都可以工作。你遇到了什么错误?可以说详细点吗?
  • 如果一个类型实现了一个接口,你可以在你的代码中访问访问这个方法,所以这是编译器在编译你的程序时知道的,因此对我来说,在运行时发现它是没有意义的。为什么需要检查这个?
  • 是的,我应该更具体一些 - 我相信,主要问题是我有一个 Type 对象,而不是要测试的 Class。例如,这很好用: Serializable.class.isAssignableFrom(JComponent.class); Serializable.class.isAssignableFrom(Thread.class);
  • 我想通过反射访问它的构造函数来构造一个对象。我想在运行时知道给定类型是否与参数类型匹配,因此我可以将相应的对象发送给构造函数。

标签: java types interface casting


【解决方案1】:

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

编辑

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

【讨论】:

  • 好的,但是如果我无法访问列表类型(或其他)的对象怎么办。我所拥有的只是一个由构造函数 c 的 c.getGenericParameterTypes() 方法给出的类型列表,我想知道其中一个是否实现了 List 接口(例如)。
  • 请尝试编写代码,如果它不起作用,请在此处发布并提出具体问题。
【解决方案2】:

object instanceof object_interface 将产生 true

【讨论】:

    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多