我需要实现具有类似于此的方法的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