[英]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.