2016-03-03 54 views
1

我需要实现具有类似于此的方法的Java接口:检查Type实例等于泛型类型

boolean canWrite(Type t); 

对我来说,它应该返回true如果类型为List<URI>

我虽然做了类似return t.equals(URI_LIST_TYPE),但我不知道如何获得代表List<URI>Type的实例。

有没有一种漂亮的方式来做到这一点?

回答

2

你需要一个型令牌,例如the one in Guava所使用这样

new TypeToken<List<String>>() {} 

这工作,因为(匿名)的子类保留有关在运行时的类型参数的信息,然后通过反射视察库。

作为附带节点,设计与反思涉及的API时,不要使用Class<E>作为输入参数,如果参数化类型可以发挥作用

+0

我不使用番石榴,宁可不包括它只是为了这个。 – holmis83

0

既然我已经使用春天我发现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>")