[英]Why is my generic implementation not working? (extends Comparable<? super 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,並且您正在發送不兼容的整數。 問問自己:如果您知道tempVal
是Integer
,為什么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.