gpt4 book ai didi

java - java泛型方法的调用

转载 作者:搜寻专家 更新时间:2023-10-30 21:04:00 25 4
gpt4 key购买 nike

给定泛型方法:

<T> List<T> getGenericList(int i) {...}

以下代码在没有任何警告的情况下编译:

public List<String> getStringList(boolean b){
if(b)
return getGenericList(0);
else
return getGenericList(1);
}

但是这个会产生“类型不匹配”编译错误:

public List<String> getStringList(boolean b) {
return (b) ? getGenericList(0) : getGenericList(1);
}

为什么?

最佳答案

不是泛型问题,而是编译器必须推断三元表达式类型的方式的结果。

对于这个等价的代码,情况也是一样的。此代码有效:

public byte function(boolean b){
if(b)
return 1;
else
return 2;
}

虽然这不是:

public byte function(boolean b) {
return (b) ? 1 : 2;
}

原因是当编译器试图推断这个表达式的类型时

    return (b) ? 1 : 2;

它首先必须获取每个操作数的类型,并检查它们是否兼容(reference)以评估三元表达式是否有效。 如果传播“返回”的类型以自动转换或提升每个操作数,则可能导致根据上下文以不同方式解析三元表达式的类型> 这个表达式。

鉴于“返回”的类型不能传播到操作数,那么在提到的情况下:

    return (b) ? getGenericList(0) : getGenericList(1);

无法绑定(bind)泛型,所以每个操作数的类型都解析为List<Object> .然后编译器得出结论,整个表达式的类型是List<Object>。 , 无法自动转换为 List<Integer> (因为它们不是兼容的类型)。

而另一个

    return getGenericList(0);

它应用“返回”的类型来绑定(bind)泛型类型 T,因此编译器得出结论,该表达式具有 List<String>。类型,可以安全返回。

关于java - java泛型方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6535144/

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