Java通用代码在eclipse中构建,但不在mvn(相同的VM版本)中构建

时间:2013-12-18 16:10:20

标签: java eclipse maven generics

任何人都可以帮我找到在 jdk1.6.0_45 中运行的这段代码有什么问题吗?

public class App {
    public static void main(final String args[]) {
        SortComparator<String, Integer> a = build();
    }

    private static <T, O extends Comparable<O>> SortComparator<T, O> build() {
        return null;
    }

    public class SortComparator<T, O extends Comparable<O>> implement Comparator<T> {
        @Override
        public int compare(final T o1, final T o2) {
            return 1;
        }
    }
}

这是一个纯Java语言问题。为什么不编译?为什么在Eclipse中呢?

  • 如果我将SortComparator<String, Integer>更改为Map<String, Integer>,则会进行编译。
  • 如果我添加参数 Class&lt; O&GT; arg 作为 build 的参数进行编译。
  • 如果我添加 App。 build()到它编译的调用。

控制台输出

incompatible types; no instance(s) of type variable(s) T,O exist so that build<T,O> conforms to SortComparator<java.lang.String,java.lang.Integer>

版本

  • Apache Maven 3.0.5(r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 14:51:28 + 0100)
  • Java版本:1.6.0_45,供应商:Sun Microsystems Inc.
  • 默认语言环境:es_ES,平台编码:Cp1252
  • 操作系统名称:“windows 7”,版本:“6.1”,arch:“x86”,系列:“windows”

2 个答案:

答案 0 :(得分:0)

因为SortComparator的返回类型不是元组(或Map.Entry)。

// Only takes one argument...
private <O extends Comparable<O>> SortComparator<O> build(final Class<O> clazz) {
  return null;
}

答案 1 :(得分:0)

我尝试了以下示例,它在Eclipse和命令行中编译良好:

public class Test {

    public static class SortComparator<T, O extends Comparable<O>> implements Comparator<T> {
        @Override
        public int compare(T o1, T o2) {
            return 0;
        }
    }

    private static <T, O extends Comparable<O>> SortComparator<T, O> build(
            final Class<O> clazz) {
        // you can return null here too
        return new SortComparator<T, O>();
    }

    public static void main(String[] args) {
        SortComparator<String, Integer> a = build(Integer.class);
    }

}