如何确保Field在编译时实现接口

时间:2013-01-24 17:59:46

标签: java generics reflection

我正在构建一个java类,用作基于Generic Comparator上显示的示例的通用比较器。我为比较器构建的构造函数如下:

public GenericComparator(java.lang.reflect.Field sortField, boolean ascending){
        ....   }

虽然上面的构造函数允许我获取sort字段,但编译器无法知道该字段是否正在实现Comparable接口,并且调用构造函数的开发人员可能会传递一个未实现的字段Comparable界面。

我想知道是否有办法使这个编译时错误并且在运行时不使用instanceof检查来处理它以确保该字段已实现接口。

Collections.sort(...)类型声明中的类似实现。

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    ...
}

1 个答案:

答案 0 :(得分:3)

Comparable.isAssignableFrom(field.getType())

在运行时执行,但根本没有办法使这成为编译时错误。字段不会(并且不能,真的)在编译时携带它们的类型信息 - 它们是运行时对象,并且可以在运行时选择。例如,如果你有

random.nextBoolean() ? Foo.class.getField("bar") : Foo.class.getField("baz")

然后没有编译器,无论多么聪明,都可以在编译时告诉结果字段会有什么类型。