gpt4 book ai didi

java - 有和没有分配给变量的未经检查的强制转换行为

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

为什么 main 中的第一行不抛出 ClassCastException 而第二行抛出?

import java.util.function.Function;

class Scratch {

static <T> T getSomething(Function<Integer, T> fun) {
return (T) fun;
}

public static void main(String[] args) {
Scratch.<String>getSomething(x -> "hello");
String something = Scratch.<String>getSomething(x -> "hello");
}
}

最佳答案

区别是因为在第一种情况下您不使用该方法的结果,但在第二种情况下您使用。

强制转换是一个表达式,但它不是一个StatementExpression。这意味着你不能这样写:

(String) somethingReturningAString();

但是你可以这样写:

String aString = (String) somethingReturningAString();

在编译时,编译器会在需要和可以插入的地方插入checkcast指令:

  • 它无法为第一种情况插入强制转换,因此不会进行任何检查。
  • 它可以(并且必须)在第二种情况下插入强制转换,以确保它正在将实际上是 String 的内容分配给 String 变量。因此,它会检查类型转换,但失败了。

值得注意的是,有一些可能是意想不到的情况,其中强制转换不是严格必需的,而是被插入的。例如:

Scratch.<String>getSomething(x -> "hello").toString();

将因 ClassCastException 而失败,因为它将转换为:

((String) Scratch.getSomething(x -> "hello")).toString();

即使 Object 有一个 toString() 方法,所以它可以在没有转换的情况下调用它。

关于java - 有和没有分配给变量的未经检查的强制转换行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56395143/

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