gpt4 book ai didi

Java 泛型奇怪的行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:28:05 26 4
gpt4 key购买 nike

这很难用语言来解释,但是 Java Generics 给了我意想不到的结果。我希望如果我说列表的类型是 ? extends Object ,我可以在那里存放任何东西。因此,如果列表类型为 Wrapper<? extends Object> ,我可以在其中存储任何类型的 Wrapper。等等。这对我来说很有意义。但让我们假设我们有:

private static class Wrapper<T> {
public Wrapper(T t) { /**/ }
}

我想要这样的东西:

private static final List<Wrapper<Wrapper<? extends Object>>> ls1 = new ArrayList<>();

请注意,这会给我一个错误:

public static <T> doit(T t) {
Wrapper<Wrapper<T>> l1 = new Wrapper<>(new Wrapper<>(t));
ls1.add(l1); // nok
// add (Wrapper<Wrapper<? extends java.lang.Object>>) in List
// cannot be applied to (Wrapper<Wrapper<T>>
}

但是如果我将 Wrapper 包装在辅助 Wrapper (rs) 中,则:

private static class C<T> extends Wrapper<Wrapper<T>> {
public C(T t) {
super(new Wrapper<>(t));
}
}

private static final List<C<? extends Object>> ls2 = new ArrayList<>();

public static <T> doit(T t) {
ls2.add(new C<>(t)); // ok
}

注意是同一个东西;这对我来说毫无意义。

附言。就我而言,我不是在制作包装器包装器,而是在制作泛型类的 ThreadLocal。

最佳答案

我觉得

? extends Object ---> equals ?

你可以这样做

List<Wrapper<Wrapper<?>>> ls1 = new ArrayList<>();

And

Wrapper<Wrapper<?>> l1 = new Wrapper<>(new Wrapper<>(t));
ls1.add(l1); // OK

关于Java 泛型奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40305143/

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