当前位置: 首页 > 知识库问答 >
问题:

将带有类型参数的类传递/返回给函数

阎晋
2023-03-14

让我们假设下面的方法(从番石榴的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中,这将返回< code>objs中所有字符串的iterable。)

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

static class Abc<E> {
    E someField;
}

我不知道如何调用过滤器并获取Iterable

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);
}

谢谢


共有2个答案

严远
2023-03-14

我发现这个编译..

public static <T> Iterable<Abc<T>> myFilter (Iterable<Abc<T>> myIterator) {
    Class<Abc<T>> myClass = null;
    Iterable<Abc<T>> a3 = Iterables.filter(myIterator, myClass); 
    return a3;
}

但它只是将同样的问题转移到myFilter()的调用方。我怀疑本·舒尔茨有正确的答案。

蔺昊穹
2023-03-14

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

您可以生成

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

 类似资料:
  • 我正在尝试按房间类别(手术室或技术室)返回过滤后的

  • 所以我试着做下面这样的事情 并且定义为 当尝试编译代码时,clang给出错误。我发现这是因为你不能从lambda推断出类型。 所以这实际上是正确的,因为我实际上希望的参数类型是从的参数推导出的类型。 所以我的问题是,有没有可能排除参数的推导,而只是使用的推导类型?

  • 有时对一个类的某些方面进行 参数化(parameterize)是很有用的。例如, 你可能需要管理不同版本的 gem 软件包,既可以为每一种版本创建分离的单独的类, 也可以使用继承和覆盖,为一个类传递一个版本号作为参数。 操作步骤 声明参数作为如下类定义的一部分: class eventmachine( $version ) { package { "eventmachine": pro

  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):

  • 问题内容: 我有一个通用函数,该函数调用Web服务并将JSON响应序列化回一个对象。 我要完成的是等效于此Java代码 我要完成的方法签名正确吗? 更具体地说,将参数类型指定为正确的做法是正确的吗? 调用该方法时,我将其作为returningClass值传递,但是出现编译 错误“无法将表达式的类型’()’转换为’String’类型” CastDAO.invokeService(“test”, wi

  • 问题内容: 我正在尝试将一些参数传递给用作回调的函数,该怎么做? 问题答案: 如果您想要更一般的东西,可以使用arguments变量,如下所示: 但是否则,您的示例可以正常工作(可以在测试器中使用arguments [0]代替回调)