gpt4 book ai didi

java - 难以理解通配符

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:50:05 24 4
gpt4 key购买 nike

public static void reverse(List<?> list) 
{
List<Object> tmp = new ArrayList<Object>(list);
for (int i = 0; i < list.size(); i++)
{

list.set(i, tmp.get(list.size()-i-1)); // compile-time error , why ?

}

}

我正在学习泛型。我知道这一点:当使用通配符时?被替换为适当的类型。当调用 reverse() 方法时?将被替换,因为每种类型都是 Object 的子类型,所以应该没有错误。我正在寻找一个清晰的解释。请帮忙。

最佳答案

您可以传递任何 List<SomeType>给你的reverse方法为 List<?> list参数,编译器应该只允许您添加 SomeType 的元素那个List .

例如,它可以是 List<String> , 一个 List<Ineger>等等……

因此list.set无法工作,因为编译器不知道实际 List<?> list 的元素类型传递给方法支持。它不知道 List<Object> tmp 的元素源自同一个list (因此可以安全地添加到其中)。

编写方法的正确方法是定义泛型类型参数:

public static <T> void reverse(List<T> list) 
{
List<T> tmp = new ArrayList<> (list);
for (int i = 0; i < list.size(); i++) {
list.set(i, tmp.get(list.size()-i-1));
}
}

现在编译器知道 listtmp两者都包含相同类型的元素。

关于java - 难以理解通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44868781/

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