java - 带有枚举比较器的抽象类 : How to make it work?

标签 java enums abstract-class comparator

我想让以下事情发挥作用。我的抽象类T延伸java.util.Comparator<T>因此应该允许我使用 compareTo方法。问题是o1.t1.compareTo(o2.t1)收到The method compareTo(capture#2-of ?) is undefined for the type capture#1-of ?

有人可以从基本层面解释一下这个问题并告诉我如何解决它吗?预先非常感谢。

public class TypeTypeComparator<T extends java.util.Comparator<T>> {

    public T t1;
    public T t2;

    public TypeTypeComparator() {
        this.t1 = null;
        this.t2 = null;
    }

    public TypeTypeComparator(T t1, T t2) {
        this.t1 = t1;
        this.t2 = t2;
    }

    public static enum Comparator implements java.util.Comparator<TypeTypeComparator<?>> {
        T1_SORT {
            public int compare(TypeTypeComparator<?> o1, TypeTypeComparator<?> o2) {
                return o1.t1.compareTo(o2.t1);
            }},
        T2_SORT {
            public int compare(TypeTypeComparator<?> o1, TypeTypeComparator<?> o2) {
                return o1.t2.compareTo(o2.t2);
            }};

        public static java.util.Comparator<TypeTypeComparator<?>> getComparator(final Comparator... options) {
            return new java.util.Comparator<TypeTypeComparator<?>>() {
                public int compare(TypeTypeComparator<?> o1, TypeTypeComparator<?> o2) {
                    for ( Comparator option : options ) {
                        int result = option.compare(o1, o2);
                        if ( result != 0 )
                            return result;
                    }
                    return 0;
                }
            };
        }
    }
}

最佳答案

您的实现过程中出现了一些问题,我已经为您解决了这些问题:)

1st issue
public class TypeTypeComparator<T extendsjava.util.Comparator<T>> {

您需要Comparable这里而不是 Comparator这里。所以就变成了 public class TypeTypeComparator<T extends <强> Comparable <T>> {

2nd issue
Recursive generics in Comparable forces you to use ? for generics
public static enum Comparator implementsjava.util.Comparator<TypeTypeComparator<?>>
or
public static enum Comparator implements java.util.Comparator<TypeTypeComparator<Comparable<?>>>

您将再次需要输入 ? 由于 Comparable 中的递归泛型声明,因此我建议您解析 Comparable 的递归泛型如下:

interface Comp extends java.lang.Comparable<Comp> {}

现在您需要替换所有 ? Comp 你就完成了。


这是完整的实现:

interface Comp extends Comparable<Comp> {}

public class TypeTypeComparator<T extends Comp> {

    public T t1;
    public T t2;

    public TypeTypeComparator() {
        this.t1 = null;
        this.t2 = null;
    }

    public TypeTypeComparator(T t1, T t2) {
        this.t1 = t1;
        this.t2 = t2;
    }

    public static enum Comparator implements java.util.Comparator<TypeTypeComparator<Comp>> {
        T1_SORT {
            @Override
            public int compare(TypeTypeComparator<Comp> o1,
                    TypeTypeComparator<Comp> o2) {
                return o1.t1.compareTo(o2.t1);
            }
        },
        T2_SORT {
            @Override
            public int compare(TypeTypeComparator<Comp> o1,
                    TypeTypeComparator<Comp> o2) {
                return o1.t2.compareTo(o2.t2);
            }
        };

        public static java.util.Comparator<TypeTypeComparator<Comp>> getComparator(final Comparator... options) {
            return new java.util.Comparator<TypeTypeComparator<Comp>>() {
                public int compare(TypeTypeComparator<Comp> o1, TypeTypeComparator<Comp> o2) {
                    for ( Comparator option : options ) {
                        int result = option.compare(o1, o2);
                        if ( result != 0 )
                            return result;
                    }
                    return 0;
                }
            };
        }
    }
}

关于java - 带有枚举比较器的抽象类 : How to make it work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28099179/

相关文章:

unit-testing - 是否可以测试这个 Kotlin 类?

java - 出来的图像比平常小! Android-Java开发

c# - 帮助枚举和 Enum.Parse

swift - 枚举模式匹配作为函数调用的参数

c# - 是否有用于在 C# 中创建匿名子类的语法?

java - 在它的抽象父类(super class)中使用子类的泛型类型?

java - SWT 日期时间格式更改

java - 广告正在加载,但不显示?

java - 匹配规则集与 Java 中的输入数据集

java - 如何将枚举传递给构造函数?