【问题标题】:Does class c implement interface<String>c类是否实现接口<String>
【发布时间】:2013-06-08 14:00:18
【问题描述】:

我有这个界面:

interface MyInt<T> {

    public void foo(T t);
}

还有这些类:

class MyString implements MyInt<String> {

    @Override
    public void foo(String t) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

class MyDouble implements MyInt<Double> {

    @Override
    public void foo(Double t) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

现在我想测试一个类是否不仅实现了MyInt(我可以做到),而且该类是否实现了MyInt&lt;String&gt;,到目前为止我的代码:

Class<MyInt> c = MyInt.class;
Class c0 = MyString.class;
Class c1 = MyDouble.class;

System.out.println(c.isAssignableFrom(c0)); //true
System.out.println(c.isAssignableFrom(c1)); //true

每次尝试添加字符串“sublass”(甚至不知道 T 的正确名称)都会导致编译错误。有什么办法吗?

【问题讨论】:

  • 您应该能够向 MyInt 添加一个 getter,它返回 T 的类。public Class getImplementedClass() { return T.getClass(); }
  • @BobDalgleish MyInt 是一个接口。您不能将方法实现添加到接口。您需要在每个实现类中都这样做,这使得整个方法毫无用处。

标签: java class interface polymorphism instanceof


【解决方案1】:

我想测试一个类是否不仅实现了 MyInt,而且该类是否实现了 MyInt

你可能想做类似的事情

Class<MyInt<String> > c = MyInt<String>.class;

但由于类型擦除,这是不可能的。请参阅Java: how do I get a class literal from a generic type? 以获得很好的解释。

为了仍然能够检查您的类是否实现了使用某些特定类型的接口,您可以检索给定类的泛型类型参数并检查它的类型:

Class c0 = MyString.class;
Class c1 = MyDouble.class;

ParameterizedType c0Type = (ParameterizedType) c0.getGenericInterfaces()[0];
Class<?> type0Class = (Class<?>) c0Type.getActualTypeArguments()[0];

ParameterizedType c1Type = (ParameterizedType) c1.getGenericInterfaces()[0];
Class<?> type1Class = (Class<?>) c1Type.getActualTypeArguments()[0];

System.out.println(type0Class.isAssignableFrom(String.class));  // true
System.out.println(type1Class.isAssignableFrom(String.class));  // false

这应该适用于您的特定情况。当您实现多个接口和/或使用多个泛型类型参数时,您需要调整数组索引。

【讨论】:

  • MyInt.class 是我尝试的第一件事,谢谢,这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多