如何检查泛型类型是否在Java中实现了泛型接口的特定类型?

我是Java泛型的新手,来自.NET世界,我习惯于编写这样的方法:

public void genericMethod<T>(T genericObject)

{

if (genericObject is IList<String>)

{

//Do something...

}

}

该方法接受通用类型的对象,并检查该对象是否实现通用接口的 特定 版本IList<>,在这种情况下为IList<String>

现在,在Java中,我可以执行以下操作:

public <T> void genericMethod(T genericObject)

{

if (genericObject instanceof Set<?>)

{

//Do something...

}

}

Java并 没有 让我做if (genericObject instanceof Set<String>)

据我所知,由于类型擦除,通常在Java中,此类将由类对象处理,我们将执行以下操作:

public <T> void genericMethod(T genericObject)

{

Class<OurTestingType> testClass = OurTestingType.class;

if (genericObject.getClass() == testClass)

{

//Do something...

}

}

但是由于我要检查的类型是通用接口,所以您不能这样做:

Class<Set<String>> testClass = Set<String>.class

那么,如何在Java中检查通用对象是否实现的特定类型Set<String>

回答:

Java实现了擦除,因此无法在运行时判断是否genericObject是的实例Set<String>。保证这一点的唯一方法是对泛型使用边界,或检查集合中的所有元素。

回答:

使用边界检查,它将在编译时检查:

public <T extends SomeInterface> void genericMethod(Set<? extends T> tSet) {

// Do something with tSet here

}

回答:

我们可以使用Java 8中的流在一行中本地完成此操作:

public <T> void genericMethod(T t) {

if (t instanceof Set<?>) {

Set<?> set = (Set<?>) t;

if (set.stream().allMatch(String.class:isInstance)) {

Set<String> strs = (Set<String>) set;

// Do something with strs here

}

}

}

回答:

对于Java 7和更早的版本,我们需要使用迭代和类型检查:

public <T> void genericMethod(T t) {

Set<String> strs = new HashSet<String>();

Set<?> tAsSet;

if (t instanceof Set<?>) {

tAsSet = (Set<?>) t;

for (Object obj : tAsSet) {

if (obj instanceof String) {

strs.add((String) obj);

}

}

// Do something with strs here

} else {

// Throw an exception or log a warning or something.

}

}

回答:

根据下面的Mark Peters的评论,如果可以将Guava添加到您的项目中,Guava也可以为您提供方法:

public <T> void genericMethod(T t) {

if (t instanceof Set<?>) {

Set<?> set = (Set<?>) t;

if (Iterables.all(set, Predicates.instanceOf(String.class))) {

Set<String> strs = (Set<String>) set;

// Do something with strs here

}

}

}

该语句Iterables.all(set, Predicates.instanceOf(String.class))本质上与相同setinstanceof Set<String>

以上是 如何检查泛型类型是否在Java中实现了泛型接口的特定类型? 的全部内容, 来源链接: utcz.com/qa/410512.html

回到顶部