【问题标题】:How do you manually pass generic parameter to a method如何手动将泛型参数传递给方法
【发布时间】:2019-04-07 18:51:58
【问题描述】:

我有方法:

public static <T> Stream<T> stream(JSONArray array) {
    return IntStream.range(0, array.length()).mapToObj(i -> {
        try {
            return (T) array.get(i);
        } catch (JSONException e) {
            return null;
        }
    });
}

当我这样称呼它时:stream(array).map((JSONObject object) -&gt; { /* ... */ }),我得到错误

无法推断功能接口类型

而且,stream&lt;JSONObject&gt;(array).map(object -&gt; { /* ... */ }) 不起作用。

stream(array).map(object -&gt; { /* ... */ }) 有效,但 object 只是 Object

【问题讨论】:

  • 如果您需要帮助,请发布一个完整的最小示例来重现问题。
  • 这正是我所做的。
  • 您需要使用mapToObj 来获取对象流。使用 map 仍然返回IntStream
  • 然后你可以删除整行:反正你永远不会对流做任何事情。
  • @Andronicus 我正在使用mapToObj...

标签: java generics type-inference


【解决方案1】:

而且,stream&lt;JSONObject&gt;(array).map(object -&gt; { /* ... */ }) 不起作用。

那是因为你把类型见证放在了错误的地方。试试:

TheContainingClass.<JSONObject>stream(array).map(object -> { /* ... */ })

但是您的代码不是类型安全的:T 的强制转换未选中。您应该简单地返回一个Stream&lt;JSONObject&gt;,并让调用者处理转换为其他类型。

【讨论】:

  • 我实际上不会使用这个函数,我正在玩弄泛型以更好地理解它们的用途。一方面,我在错误时将空值插入流中
  • @Tobiq 那么你应该试着理解为什么这样使用泛型是如此危险。
猜你喜欢
  • 1970-01-01
  • 2014-06-08
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多