java - Java将泛型与另一个类的Comparable进行比较
问题描述
我有一个“模式”和“字段”模型,其中一个字段表示一种数据类型并具有如何解析它的方法,而模式是字段的集合。我正在尝试实现泛型比较,但是,我无法编译代码,也无法找出正确的泛型范围。我怎样才能让它工作?
class Field<T extends Comparable<? super T>> {
T parse(String val) {
...
}
}
public class Schema {
Map<Integer, Field<?>> fields;
Field<?> getField(int index){ ... }
}
public class Comparison {
public static <T extends Comparable<? super T>> boolean greaterThan(Field<T> f, String val1, String val2) {
// compiles as expected
return f.parse(val1).compareTo(f.parse(val2)) > 0;
}
public static boolean greaterThan2(Field<?> f, String val1, String val2) {
// does not compile -> required capture of ? super capture of ?, provided capture of ?
return f.parse(val2).compareTo(f.parse(val2));
}
}
public class App {
public static void main(String[] args) {
Schema s = ...
// does not compile, required type Field<T>, provided type Field<capture of ?>
Comparison.greaterThan(s.getField(0), "val1", "val2");
// compiles
Comparison.greaterThan2(s.getField(0), "val1","val2");
}
}
解决方案
下面的代码在 1.8 中编译
import java.util.Map;
class Field<T extends Comparable<? super T>> {
T parse(String val) {
return null;
}
}
class Schema {
Map<Integer, Field<?>> fields;
Field<?> getField(int index){ return null; }
}
class Comparison {
public static <T extends Comparable<? super T>> boolean greaterThan(Field<T> f, String val1, String val2) {
// compiles as expected
return f.parse(val1).compareTo(f.parse(val2)) > 0;
}
}
public class App {
public static void main(String[] args) {
Schema s = new Schema();
//compiles ok
Comparison.greaterThan(s.getField(0), "val1", "val2");
}
}
推荐阅读
- python - Python and PDF Forms - error with field name
- git - How to temporarily remove one past changest from master branch and merge back in the future?
- python - 如果未找到文本节点,则跳过提取值
- git - 避免重新解决 git rebase 中的冲突,包括合并提交
- php - Wordpress 中的 PHP 警告
- r - 每个盒子中具有最大尺寸的多项式随机生成
- ubuntu-18.04 - 应该如何配置或安装 salt-cloud 以使用 Saltstack py3 存储库来安装 minion 而不是分发(apt)存储库?
- android - 在屏幕 ARCore 上居中 3D 模型
- excel - Excel VBA 中的幻灯片和形状对象错误
- amazon-web-services - 无法使用 Session Manager 连接 EC2 实例