簡體   English   中英

有沒有辦法定義檢查null然后創建對象的泛型方法?

[英]Is there a way to define a generic method that checks for null and then create the object?

我想編寫一個方法來檢查參數為null的位置,如果是,則返回該類型的新對象。 看起來像:

public static <T> T checkNull(T obj) {
    if (null == obj) return someHowCreateTheObjectWithTypeT();
    else return obj;
}

經過一番掙扎和挖掘,我仍然無法找到實現這一目標的方法,它在java中是否可能?

起初我想過反思。 但是,當對象為null時,我無法獲取Class實例,並且如果沒有類型T的名稱,則無法創建Class ...

更新:

我想過將一個Class作為參數傳遞,但這不是最好的解決方案,如下面的答案所示:)

我的currunt解決方案是使用defaultValue參數:

public static <T> T checkNull(T obj, T defaultValue) {
    if (null == obj) return defaultValue;
    return obj;
}

這比反射解決方案更快更安全,並且是相同的冗長; 但是我必須為所有感興趣的類型系統地指定一個DEFAULT_VALUE,這不是一件容易的事。

通用信息僅為編譯時,在運行時不可用。 您必須將對象的Class作為提示傳遞,並且該類必須具有公共默認構造函數。 例如

public static T checkNull(Object o, Class<T> c) {
  try {
    return (o == null) ? c.newInstance() : o;
  } catch (Exception e) {
    return null;
  }
}

這是不可能的。 為了使泛型以這種方式工作,它必須在編譯時捕獲它將被調用的類型。 但是, null沒有類型,因此您無法找出T來實例化它。

現在,您可以解決此問題,同時傳遞Class實例,但是您需要使用Reflection來進行一些相當強大的錯誤處理,以確保類型T是一個具體的類,並且具有可以調用的公共無參數構造函數。

無法做到。 您必須添加Class<T>的其他參數,然后將其用於反射新的。 類型T在編譯過程中不存在。

正如其他人所指出的那樣,這是不可能做到的。 但是, Guava提供的等效於您發布的方法的默認值:

String foo = Objects.firstNonNull(someString, "default");

這與您的方法略有不同,因為如果兩個參數都為null ,則firstNonNull將拋出NullPointerException

另一個選擇是創建一個使用Guava的Supplier<T>接口或類似方法的方法:

public static T firstNonNull(T first, Supplier<? extends T> defaultSupplier) {
  return first != null ? first : Preconditions.checkNotNull(defaultSupplier.get());
}

然后,您可以使用當且僅當第一個參數為null時創建並返回新默認實例的Supplier

暫無
暫無

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

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