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

Java 如何确保字段在编译时实现接口,java,generics,reflection,Java,Generics,Reflection,我正在构建一个java类,以用作基于上所示示例的通用比较器。我为比较器构建的构造函数如下所示: public GenericComparator(java.lang.reflect.Field sortField, boolean ascending){ .... } 虽然上面的构造函数允许我获取排序字段,但编译器无法知道字段是否实现了Comparable接口,调用构造函数的开发人员可能会传递一个未实现Comparable接口的字段 我想知道是否有一种方法可以使这成为编译时

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

public GenericComparator(java.lang.reflect.Field sortField, boolean ascending){
        ....   }
虽然上面的构造函数允许我获取排序字段,但编译器无法知道字段是否实现了
Comparable
接口,调用构造函数的开发人员可能会传递一个未实现
Comparable
接口的字段

我想知道是否有一种方法可以使这成为编译时错误,而不是在运行时使用instanceof check来处理它,以确保字段实现了接口

类似的实现可以在
集合.sort(…)
类型声明中找到

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    ...
}
公共静态
在运行时执行此操作,但根本无法将其作为编译时错误。字段在编译时不(实际上也不能)携带它们的类型信息——它们是运行时对象,可以在运行时选择。例如,如果你有

random.nextBoolean() ? Foo.class.getField("bar") : Foo.class.getField("baz")
那么,无论编译器多么聪明,都无法在编译时判断结果字段的类型

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