gpt4 book ai didi

java - 泛型与功能相似方法的 Eclipse 错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:41 25 4
gpt4 key购买 nike

我有一个 Foo<T extends Foo<T>>抽象类。我想根据其父类存储其实现的实例,因此我将它们存储在 map private static final Map<Class<? extends Foo<?>>, Foo<?>> FOOS = new HashMap<>(); 中要添加到此映射,使用父类调用一个方法,然后通过反射对其进行初始化。

public static Foo<?> addFoo(Class<? extends Foo<?>> foo) throws InstantiationException, IllegalAccessException {
return Optional.ofNullable(Foo.FOOS.get(foo)).orElse(Optional.ofNullable(Foo.FOOS.put(foo, foo.newInstance())).orElse(Foo.FOOS.get(foo)));
}

然而,这会在 Eclipse 中产生一个错误:The method orElse(Foo<capture#25-of ?>) in the type Optional<Foo<capture#25-of ?>> is not applicable for the arguments (Foo<capture#29-of ?>)

然而,这种功能相似的方法不会产生任何错误。

public static Foo<?> addFoo(Class<? extends Foo<?>> foo) throws InstantiationException, IllegalAccessException {
Optional<Foo<?>> possibleFoo = Optional.ofNullable(Foo.FOOS.get(foo));
if(possibleFoo.isPresent()) {
return possibleFoo.get();
}
//The set to possibeFoo with an Optional is not needed, but this is for demonstration purposes
possibleFoo = Optional.ofNullable(Foo.FOOS.put(foo, foo.newInstance()));
return Foo.FOOS.get(foo);
}

为什么第一个会报错而第二个却不报错,尽管它们在功能上很相似?

最佳答案

这是一个产生相同问题的更简单的示例。

static void example(List<?> list1, List<?> list2) {
Optional.of(list1).orElse(list2); // compile error
}

这看起来应该可行。 Optional.of(list1)是一个 Optional<List<?>>所以方法 orElse应该申请?

这里的问题是捕获的工作方式。假设 list1List<String> .然后我们想要 Optional.of(list1)成为Optional<List<String>> .另一方面,如果 list1List<Integer>我们想要 Optional.of(list1)成为Optional<List<Integer>> .所以编译器不会处理 Optional.of(list1) 的类型作为 Optional<List<?>> ,而是作为 Optional<List<X>>对于某些未知类型 X .

因为类型 X未知,list2 的项目类型也不知道,它们可能不匹配。

您可以通过告诉编译器您确实希望类型为 Optional<List<?>> 来解决这个问题:

Optional.<List<?>>of(list1).orElse(list2);   // compiles fine.

您的示例本质上是相同的。你可以让它像这样编译。

return Optional.<Foo<?>>ofNullable(FOOS.get(foo))
.orElse(Optional.<Foo<?>>ofNullable(FOOS.put(foo, foo.newInstance()))
.orElse(FOOS.get(foo)));

一般来说,如果你在编译一长串涉及通配符和泛型类型的代码时遇到问题,我认为最好将它分成几行,并在途中声明一些表达式的类型 (就像您在第二个示例中所做的那样)。

关于java - 泛型与功能相似方法的 Eclipse 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32730082/

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