gpt4 book ai didi

java - 将具有类型参数的类传递/返回给函数

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:13 25 4
gpt4 key购买 nike

让我们假设以下方法(比如来自 Guava 的 Iterables):

public static <T> Iterable<T> filter(final Iterable<?> unfiltered, final Class<T> type) {
return null;
}

和这个集合:

Set<?> objs = ...;

然后下面的代码编译并且泛型被正确派生

Iterable<String> a2 = Iterables.filter(objs, String.class);

(在 Guava 中,这将返回 objs 中所有字符串的可迭代。)

但现在让我们假设以下类:

static class Abc<E> {
E someField;
}

我不知道如何调用 filter得到 Iterable<Abc<?>> :

Iterable<Abc>    a3 = Iterables.filter(objs, Abc.class);
Iterable<Abc<?>> a4 = Iterables.filter(objs, Abc.class); // Compile error - Abc and Abc<?> are incompatible types
Iterable<Abc<?>> a5 = Iterables.filter(objs, Abc<?>.class); // Compile error
Iterable<Abc<?>> a6 = Iterables.<Abc<?>>filter(objs, Abc.class); // Compile error
Iterable<Abc<?>> a7 = (Iterable<Abc<?>>) Iterables.filter(objs, Abc.class); // Compile error - inconvertible types
Iterable<Abc<?>> a8 = Iterables.filter(objs, new Abc<?>().getClass()); // Compile error
Iterable<Abc<?>> a8a = Iterables.filter(objs, new Abc<Object>().getClass()); // Compile error

只有 a3 可以编译,但是我在 Abc 上没有参数,因此后续代码中没有进行泛型类型检查。

我知道类型参数在运行时不存在,所以我不会尝试编写如下代码:

Iterable<Abc<String>> a9 = Iterables.filter(objs, Abc<String>.class); // Compile error

我只想过滤所有类型为 Abc 的对象(如 a3 所做的那样),但结果中包含通用参数。我发现这样做的唯一方法是以下,这是愚蠢的:

Iterable<Abc<?>> a10 = new HashSet<Abc<?>>();
for (Abc<?> a : Iterables.filter(objs, Abc.class)) {
((Set<Abc<?>>)a10).add(a);
}

谢谢。

最佳答案

这个问题没有令人满意的答案。仅使用无限通配符 参数化的类型的类文字在理论上可行,我们只是没有它们。

您可以生成 Class<Abc<?>>具有未经检查的类型转换的类型化类对象,并将其移动到实用程序方法或字段。只要很少Abc s,这很好用。

@SuppressWarnings("unchecked")
public static Class<Abc<?>> ABC = (Class<Abc<?>>)(Object) Abc.class;

关于java - 将具有类型参数的类传递/返回给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10869467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com