首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java泛型:将List<TypeA>转换为List<TypeB>

Java泛型:将List<TypeA>转换为List<TypeB>
EN

Stack Overflow用户
提问于 2021-04-29 17:44:54
回答 2查看 73关注 0票数 2

我想这是一个基本的问题。然而,从C++的角度来看,这并不像我预期的那么容易。请考虑以下代码:

代码语言:javascript
运行
复制
import java.util.ArrayList;
import java.util.List;

final class TestClass {

    public class Foo {
        int myInt;
        float myFloat;
    }

    public class Bar {
        int myInt;
        float myFloat;
    }

    private static Bar toBar(Foo in) {
        Bar out = new Bar();
        out.myInt = in.myInt;
        out.myFloat = in.myFloat;
        return out;
    }

    public static <InT, OutT> List<OutT> toBar(List<InT> in) {
        List<OutT> out = new ArrayList<>(in.size());
        for (InT inElement: in) {
            out.add(toBar(inElement));
        }
        return out;
    }
}

这会给我一个错误:“错误:找不到适用于toBar(InT)的方法”。

我有很多集合,需要从List<TypeA1>转换为List<TypeB1>,从List<TypeA2>转换为List<TypeB2>。为了减少代码,我希望在Java泛型中提取列表迭代,同时在具体实现中进行元素转换。有什么想法,该怎么做?不幸的是,第三方库是不允许的。

非常感谢。

EN

Stack Overflow用户

发布于 2021-04-29 19:38:45

尽管在语法上很相似,但C++模板和Java泛型是非常不同的。

在C++中,模板在使用模板时在编译时被实例化。因此,如果我编写toBar(listOfFoos),编译器就会开始编译toBar(List<Foo>)方法。此时,它知道需要调用toBar(Foo)。如果我在几行之后编写toBar(listOfBazs),它会编译一个额外的toBar(List<Baz>)方法,在这个方法中可以调用一个完全不同的方法。

另一方面,在Java中,该方法只编译一次。在编译时,必须清楚要调用哪个方法。在您的情况下,它找不到匹配的方法。

一种选择是将该方法作为参数传递:

代码语言:javascript
运行
复制
 public static <InT, OutT> List<OutT> toBar(List<InT> in, Function<InT, OutT> fn) {
    List<OutT> out = new ArrayList<>(in.size());
    for (InT inElement: in) {
        out.add(fn.apply(inElement));
    }
    return out;
}

并使用以下命令调用它:

代码语言:javascript
运行
复制
result = toBar(listOfFoos, TestClass::toBar);

或者你使用一个流:

代码语言:javascript
运行
复制
result = listOfFoos.stream()
                   .map(TestClass::toBar)
                   .collect(Collectors.toList());
票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67314901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档