Unchecked Conversion 导致的 Java 方法返回类型变更

本文探讨了在Java中遇到的由于Unchecked Conversion导致的方法返回类型变化的问题。当调用方法时发生unchecked conversion,方法返回类型会变成擦除后的原始类型。通过分析lambda表达式的类型推断,发现在某些情况下,方法返回类型可能不符合预期,这与泛型擦除和未检查警告有关。泛型擦除是指在编译过程中,将通用类型转换为无类型的类,而unchecked warning则是在编译期间因类型安全无法保证而产生的警告。
摘要由CSDN通过智能技术生成

问题

在 v2 遇到有同学反馈了个问题, 第一眼的感觉应该是泛型擦除(Type Erasure)和类型推断(Type Inference)导致的. 但当我尝试去彻底解释这个问题的时候, 才发现关键原因是: 如果在调用方法时有 unchecked conversion, 那么方法返回的是定义中返回类型经过擦除(erasure)后的结果.

具体问题是这个样子的:

public static List<String> methodA(Collection<String> stringCollection) {
    List<String> stringList = new ArrayList<>();
    for (String s : stringCollection) {
        stringList.add(s);
    }
    return stringList;
}

public static void methodB(String s) {}

public static void main(String args[]) {
    // ok
    methodA((Collection<String>) new ArrayList<String>()).stream().forEach(p -> methodB(p));

    // compile error
    // Question.java:29: 错误: 不兼容的类型: Object无法转换为String
    // methodA((Collection) map.get("A")).stream().forEach(p -> methodB(p));
    //                                                                  ^
    methodA((Collection) new Arr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值