我需要实现一个Java接口,其方法类似于:
boolean canWrite(Type t);
在我的情况下,如果类型为true
,则应返回List<URI>
。
我虽然做了return t.equals(URI_LIST_TYPE)
这样的事情,但我不知道如何获得代表List<URI>
的{{3}}实例。
有一种漂亮的方法吗?
答案 0 :(得分:2)
您需要一个类型令牌,例如the one in Guava,就像这样使用
new TypeToken<List<String>>() {}
这是有效的,因为(匿名)子类在运行时保留有关类型参数的信息,然后可以由反射库检查。
作为副节点,在设计处理反射的API时,如果参数化类型可以发挥作用,请不要使用Class<E>
作为输入参数
答案 1 :(得分:0)
由于我已经使用 Spring ,因此我发现ParameterizedTypeReference class非常有用。 (我猜它与Guava的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>")