gpt4 book ai didi

具有 lambda 表达式的 Java 泛型对象

转载 作者:行者123 更新时间:2023-11-29 08:40:05 29 4
gpt4 key购买 nike

我目前正在通读 Java Core 书,并且在阅读通用章节。我不能在这里掌握一件事。正如书中所述,您不能在泛型类中用 T 创建新对象,所以这是不可能的

public foo() { first = new T(); second = new T(); } //ERROR

你可以做的是像这样使用函数式接口(interface)和 lambda 表达式来引用构造函数

foo<String> f = foo.makeFoo(String::new)

public static <T> foo<T> makeFoo(Supplier<T> constr)
{
return new foo<>(constr.get(), constr.get());
}

它很棒,按预期工作,但仅限于 String,如果我想与任何其他对象一起使用,例如包装的简单类型 Integer,这是不可能的。它给了我这个错误

Error:(35, 38) java: method makeFoo in class generic.foo<T> cannot be applied to given types;
required: java.util.function.Supplier<T>
found: Integer::new
reason: cannot infer type-variable(s) T
(argument mismatch; incompatible parameter types in method reference)

它似乎只适用于 String,我不知道为什么,我认为它适用于每个对象

我正在尝试在正确的类上创建所有这些对象

  foo<String> fString = foo.makeFoo(String::new); //Works
foo<Integer> fInteger = foo.makeFoo(Integer::new); //Doesn't work
foo<Double> fDouble = foo.makeFoo(Double::new); //Doesn't work

编辑

实际上这适用于自定义对象,只有包装的简单类型不会编译

foo<MyCustomObject> fCustom = foo.makeFoo(MyCustomObject::new); //Works

最佳答案

对比String , 没有 Integer 的无参数构造函数.所以Integer::new不是 Supplier<Integer> . makeFoo(Object::new)会工作。

关于具有 lambda 表达式的 Java 泛型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40972165/

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