首页 > 解决方案 > 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");
}
}

标签: javagenerics

解决方案


下面的代码在 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");
}
}


推荐阅读