簡體   English   中英

Java通用代碼

[英]Java Generic code

我是仿制葯的新手。 在了解了valfilterSmallfilterGreat的確切類型后,您可以看到我正在重復一些代碼。 我想編寫通用代碼來比較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>

您不能在泛型方法中使用<>運算符。 通常,當變量的類型為FloatLong ,編譯器會在編譯代碼中進行自動拆箱轉換(獲取基元類型)后接受運算符。 換一種說法,

filterSmall <= val

編譯為:

filterSmall.longValue() <= val.longValue()

在泛型方法中,編譯器無法應用拆箱轉換。 執行比較的唯一方法是讓type參數擴展Comparable接口,並使用compareTo方法。 注意FloatLong等類型已經實現了這個接口。

暫無
暫無

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

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