Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型:转换列表<;A型>;列出<;类型B>;_Java_Generics - Fatal编程技术网

Java泛型:转换列表<;A型>;列出<;类型B>;

Java泛型:转换列表<;A型>;列出<;类型B>;,java,generics,Java,Generics,我想这是一个基本问题。然而,来自C++的这并不像我想象的那么容易。请考虑以下代码: import java.util.ArrayList; import java.util.List; final class TestClass { public class Foo { int myInt; float myFloat; } public class Bar { int myInt; float myF

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

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;
    }
}
import java.util.ArrayList;
导入java.util.List;
最终类TestClass{
公开课Foo{
int-myInt;
浮动我的浮动;
}
公共类酒吧{
int-myInt;
浮动我的浮动;
}
专用静态酒吧toBar(Foo in){
Bar out=新条();
out.myInt=in.myInt;
out.myFloat=in.myFloat;
返回;
}
公共静态列表toBar(列表中){
List out=new ArrayList(in.size());
for(InT-inement:in){
加上(toBar(非水泥));
}
返回;
}
}
这给了我一个错误:“错误:找不到适合toBar(InT)的方法”

我有很多收藏,需要从
List
转换为
List
List
转换为
List
。为了减少代码,我想在Java泛型中提取列表迭代,同时在具体实现中进行元素转换。有什么想法,怎么做?不幸的是,不允许使用第三方LIB


非常感谢。

您的
static
方法无法通过编译,因为您调用的
toBar
方法需要一个
Foo
参数,而不是任何类型的泛型参数

您不需要方法来进行转换。您可以通过相对较短的
管道实现同样的效果:

List<Foo> foos = ...
List<Bar> bars = foos.stream().map(TestClass::toBar).collect(Collectors.toList());
你把它叫做:

List<Foo> foos = ...
List<Bar> bars = convert(foos,TestClass::toBar);
listfoos=。。。
列表栏=转换(foos,TestClass::toBar);

> 尽管句法相似,C++模板和java泛型有很大的不同。 在C++中,模板在使用模板时编译时实例化。因此,如果我编写
toBar(listofoos)
,编译器将开始编译
toBar(List)
方法。此时,它知道需要调用
toBar(Foo)
。如果我在几行之后编写
toBar(listofbaz)
,它会编译一个额外的
toBar(List)
方法,在这个方法中可以调用完全不同的方法

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

一个选项是将方法作为参数传递:

 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;
}
或者使用流:

result = listOfFoos.stream()
                   .map(TestClass::toBar)
                   .collect(Collectors.toList());

第一种toBar方法采用Foo。InT不一定是一个Foo。。。并返回一个
,它不一定是一个
输出
。为什么不直接使用
公共静态列表toBar(List in){
!?@luk2302 OP说他们希望这是通用的,因为他们有许多不同类型的列表
result = toBar(listOfFoos, TestClass::toBar);
result = listOfFoos.stream()
                   .map(TestClass::toBar)
                   .collect(Collectors.toList());