簡體   English   中英

Java泛型-類型T中的方法validate(T,T)不適用於自變量(可比較,可比較 <capture#11-of ?> )

[英]java generics - The method evaluate(T,T) in the type T is not applicable for the arguments (Comparable, Comparable<capture#11-of ?>)

由於我將Java版本升級到8,因此通用方法出現了問題。調用如下:

Operator o;
Comparable a;
Comparable<?> b;
boolean match = o.evaluate(a, b)

和方法

public enum Operator{

    public <T extends Comparable<T>> boolean evaluate(T value1, T value2) {

        if (value1 == null && value2 != null) {
            return false;
        }

        switch (this) {
        //some code here
        }     
    }
}

唯一的例外是:運算符類型中的方法validate(T,T)不適用於自變量(可比較,可比較)

提前致謝!

evaluate期望使用已知為相同類型的參數,可以將其與自身進行比較,但事實並非如此。

您的通用方法有兩個條件:

  1. 其返回類型相對於自身擴展了Comparable接口。
  2. 它的兩個參數(和返回類型)都屬於同一類型。

但是,您要傳遞兩個參數,嚴格來說,它們不是同一類型。 其中一個是原始的Comparable對象(其基本類型是Object),另一個是非原始的Comparable,但是具有未知的基本類型。

實際上,您可以為b分配一個整數,並且與原始的Comparable不嚴格兼容。

使用a.compareTo(b)不會導致編譯時錯誤,因為a是原始Comparable,它將接受任何Comparable對象,但會認為它是Comparable,並且b可以強制轉換為Object 這就是原始類型的工作方式。 如果兩個對象不匹配,則只會得到警告和運行時錯誤。

但是,使用b.compareTo(a)會導致編譯時錯誤,因為已知b具有基本類型,但目前尚不知道它是什么。 因此,未知Comparable<Object>是否可以強制轉換為它。

暫無
暫無

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

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