我需要實現具有類似於此的方法的Java接口:檢查Type實例等於泛型類型
boolean canWrite(Type t);
對我來說,它應該返回true
如果類型爲List<URI>
。
我雖然做了類似return t.equals(URI_LIST_TYPE)
,但我不知道如何獲得代表List<URI>
Type的實例。
有沒有一種漂亮的方式來做到這一點?
我需要實現具有類似於此的方法的Java接口:檢查Type實例等於泛型類型
boolean canWrite(Type t);
對我來說,它應該返回true
如果類型爲List<URI>
。
我雖然做了類似return t.equals(URI_LIST_TYPE)
,但我不知道如何獲得代表List<URI>
Type的實例。
有沒有一種漂亮的方式來做到這一點?
你需要一個型令牌,例如the one in Guava所使用這樣
new TypeToken<List<String>>() {}
這工作,因爲(匿名)的子類保留有關在運行時的類型參數的信息,然後通過反射視察庫。
作爲附帶節點,設計與反思涉及的API時,不要使用Class<E>
作爲輸入參數,如果參數化類型可以發揮作用
既然我已經使用春天我發現ParameterizedTypeReference class有用。 (我猜它類似於番石榴的TypeToken
)。在我的情況:
URI_LIST_TYPE = (new ParameterizedTypeReference<List<URI>>() {}).getType();
也有比較作爲字符串的可能性:
t.toString().equals("java.util.List<java.net.URI>")
或用的Java 8了更明確的行爲:
t.getTypeName().equals("java.util.List<java.net.URI>")
我不使用番石榴,寧可不包括它只是爲了這個。 – holmis83