2

我有这个界面:

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<String>了,我的代码到目前为止:

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 的正确名称)都会导致编译错误。有什么办法可以做到这一点?

4

1 回答 1

2

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

你可能想做类似的事情

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

但由于类型擦除,这是不可能的。请参阅Java:如何从泛型类型中获取类文字?一个很好的解释。

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

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

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

于 2013-06-12T13:46:23.667 回答