簡體   English   中英

為什么通用約束T擴展了可比性 <T> 還不足以避免演員陣容?

[英]Why generic constraint T extends Comparable<T> is not sufficient to avoid a cast?

我有這樣的課:

public class AbstractParameter<T extends Comparable> {
  ....
    public void validate(T tempVal, StringBuilder msg) {
        if(tempVal.compareTo(new Integer(0)) != 0 ) {
            //do something
        }
    }
  ....
}

tempVal將是一個整數。 它可以編譯並運行良好。 但是,如果我將T擴展Comparable更改為T extends Comparable<T>在if語句上方生成以下編譯錯誤:

required: T#1
found: Integer
reason: actual argument Integer cannot be converted to T#1 by method invocation conversion
where T#1,T#2 are type-variables:
  T#1 extends Comparable<T#1> declared in class AbstractParameter
  T#2 extends Object declared in interface Comparable

我可以將新的Integer(0) 強制轉換為T以消除編譯錯誤。 我的問題是我應該使用public class AbstractParameter<T extends Comparable>還是public class AbstractParameter<T extends Comparable<T>>

我猜應該使用public class AbstractParameter<T extends Comparable<T>> ,但是(T)new Integer(0)似乎很煩人。 我的代碼有什么問題嗎?

因為Comparable<T>.compareTo()的參數類型為T,並且您正在發送不兼容的整數。 問問自己:如果您知道tempValInteger ,為什么tempVal將其聲明為T?

公共抽象類AbstractParameter實現Comparable將產生編譯錯誤,因為在內部validate您在tempVal上調用compareTo ,並且由於T上沒有上限(T可以是任何東西),編譯器無法解析方法tempVal.compareTo(...)

您在帖子中提到“ tempVal將是一個整數”。 因此,請更改類定義以包括此信息,以避免未經檢查的警告

public abstract class AbstractParameter<T extends Comparable<Integer>>

暫無
暫無

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

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