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



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

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

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

我想知道是否有办法使其成为编译时错误,而不是在运行时使用实例检查来处理它,以确保该字段已实现接口。

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

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

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

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

那么,无论多么聪明,任何编译器都无法在编译时告诉生成的字段将具有什么类型。

最新更新