检查Type实例是否等于泛型类型

时间:2016-03-03 10:32:13

标签: java generics reflection

我需要实现一个Java接口,其方法类似于:

boolean canWrite(Type t);

在我的情况下,如果类型为true,则应返回List<URI>

我虽然做了return t.equals(URI_LIST_TYPE)这样的事情,但我不知道如何获得代表List<URI>的{​​{3}}实例。

有一种漂亮的方法吗?

2 个答案:

答案 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>")