簡體   English   中英

使用比較器時同一類型出現不兼容類型錯誤

[英]Incompatible Type error on same type when using Comparator

我有一個名為Interval的通用 class

package com.test;

//import statements

public class Interval<T extends Comparable<? super T>> {

    private boolean isStartInclusive;
    private T start;
    private T end;
    private boolean isEndInclusive;

    //Constructors

    //Getter and Setters

    //ToString

    //Hashcode and Equals

    //A public static method that returns comparator for use by other classes
    public static <T extends Comparable<? super T>> Comparator<Interval<T>> getIntervalComparator() {
        return (o1, o2) -> {
            //comparing logic that returns -1 or 1 or 0
        };
    }

}

每當我使用此ComparatorList<Interval<T>>進行排序時,它都會起作用。

List<Interval<T>> intervalsList1 = getIntervalsList();
intervalsList1.sort(Interval.getIntervalComparator());

但是當我這樣做時

List<Interval<T>> intervalsList1 = getIntervalsList1();
List<Interval<T>> intervalsList2 = getIntervalsList2();

Interval<T> interval1 = intervalsList1.get(i);
Interval<T> interval2 = intervalsList2.get(i);

int compareOneVsTwo = Interval.getIntervalComparator().compare(interval1, interval2); //line 85

我收到一條錯誤消息

Error:(85, 76) java: incompatible types: com.test.Interval<T> cannot be converted to com.test.Interval<T>

即使我這樣做

Interval<Integer> integerInterval1 = new Interval<>(true, 1, 2, true);
Interval<Integer> integerInterval2 = new Interval<>(true, 4, 5, true);
int compareOneVsTwo = Interval.getIntervalComparator().compare(integerInterval1, integerInterval2); //line 115

我收到此錯誤:

Error:(115, 72) java: incompatible types: com.test.Interval<java.lang.Integer> cannot be converted to com.test.Interval<T>

我不明白是什么導致了這個編譯錯誤。 Interval class里面的comparator不是自然的排序順序,而是多個類為了自己的目的排序時使用的順序。

如果將語句分成兩個單獨的語句,它應該可以工作:

Comparator<Interval<T>> compareOneVsTwo = Interval.getIntervalComparator();
compareOneVsTwo.compare(interval1, interval2);

// or in the integer case:
Comparator<Interval<Integer>> compareOneVsTwo = Interval.getIntervalComparator();
compareOneVsTwo.compare(interval1, interval2);

(假設T是現有類型)

這是因為當它們是相同的語句時,編譯器不夠聰明,無法知道您需要Comparator<Interval<Integer>> 就編譯而言,您可能需要Comparator<Interval<String>>Comparator<Interval<LocalDate>>因為它在推斷getIntervalComparator調用的類型參數時不查看.compare調用。

當編譯器不知道時會發生什么? 它使用綁定在類型參數上的類型,即Comparable<? super T> Comparable<? super T> ,所以它認為你需要一個Comparator<Interval<T>> ,但T實際上並不存在......

解決此問題的另一種方法是:

Interval.<Integer>getIntervalComparator().compare(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM