[英]Java Generic code
我是仿制葯的新手。 在了解了val
, filterSmall
, filterGreat
的確切類型后,您可以看到我正在重復一些代碼。 我想編寫通用代碼來比較val
和過濾器值。 我可以寫這樣的東西
private <T> boolean compareAgainstFilters(T val, T filterSmall, T filterGreat) {
if (!(filterSmall != null && filterSmall <= val)) {
return true;
}
if (!(filterGreat != null && val <= filterGreat)) {
return true;
}
return true;
}
但是在編譯時,java不知道<=
運算符是否對類型T
有效。
我不想重復代碼,那么我怎么能實現呢?
if (value != null) {
switch (value.getClass().getName()) {
case "java.lang.Long":
Long filterSmall = (Long) filterSmaller;
Long filterGreat = (Long) filterGreater;
Long val = (Long) value;
if (!(filterSmall != null && filterSmall <= val)) {
return true;
}
if (!(filterGreat != null && val <= filterGreat)) {
return true;
}
break;
case "java.lang.Float":
Float filterSmallFloat = (Float) filterSmaller;
Float filterGreatFloat = (Float) filterGreater;
Float valFloat = (Float) value;
if (!(filterSmallFloat != null && filterSmallFloat <= valFloat)) {
return true;
}
if (!(filterGreatFloat != null && valFloat <= filterGreatFloat)) {
return true;
}
}
}
您可以使用Comparable
接口來比較數字,因為所有數字基元的包裝類都實現它:
private <T extends Comparable<T>> boolean compareAgainstFilters(T val, T filterSmall, T filterGreat) {
if (!(filterSmall != null && filterSmall.compareTo(val)<=0)) {
return true;
}
if (!(filterGreat != null && val.compareTo(filterGreat)<=0)) {
return true;
}
return true;
}
<T extends Comparable<T>>
限制可用作類型參數而不是T的類型。在這種情況下,它們需要實現Comparable<T>
。
您不能在泛型方法中使用<
或>
運算符。 通常,當變量的類型為Float
或Long
,編譯器會在編譯代碼中進行自動拆箱轉換(獲取基元類型)后接受運算符。 換一種說法,
filterSmall <= val
編譯為:
filterSmall.longValue() <= val.longValue()
在泛型方法中,編譯器無法應用拆箱轉換。 執行比較的唯一方法是讓type參數擴展Comparable
接口,並使用compareTo
方法。 注意Float
, Long
等類型已經實現了這個接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.