Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要把一根绳子换成一根绳子?_Java_String - Fatal编程技术网

Java 为什么要把一根绳子换成一根绳子?

Java 为什么要把一根绳子换成一根绳子?,java,string,Java,String,Oracle Java社区站点上的一篇文章给出了以下方法作为示例(对于JPA转换器,但我想这与此无关): public Boolean convertToEntityAttribute(String y) { String val = (String) y; if(val.equals("Y")){ return true; } else { return false; } } 将字符串y强制转换为字符串val有什么用?这样做有正

Oracle Java社区站点上的一篇文章给出了以下方法作为示例(对于JPA转换器,但我想这与此无关):

public Boolean convertToEntityAttribute(String y) {
    String val = (String) y;
    if(val.equals("Y")){
        return true;
    } else {
        return false;
    }
}
将字符串y强制转换为字符串val有什么用?这样做有正当理由吗


原文:

这样的演员阵容完全没有必要。我可以想象那是以前

public Boolean convertToEntityAttribute(Object y) {
    String val = (String) y;
    ...
}

但是后来参数类型被更改为
String
,作者只是忘记了删除强制转换。

这个多余的强制转换是无用的

当前代码可以简化为

public Boolean convertToEntityAttribute(String y) {
    return "Y".equals(y);
}
这样做有正当理由吗

什么都没有

但另一方面,Java编译器知道类型转换是不必要的,并对其进行了优化。因此,唯一的“损害”是可读性

比如说

[stephen@blackbox tmp]$ cat Test.java 
public class Test {
    public void test (String x) {
        String s = (String) x;
        System.out.println(s);
    }
}
[stephen@blackbox tmp]$ javac Test.java 
[stephen@blackbox tmp]$ javap -c Test
Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public void test(java.lang.String);
    Code:
       0: aload_1
       1: astore_2
       2: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       5: aload_2
       6: invokevirtual #3                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       9: return
}
[stephen@blackbox tmp]$ 
[stephen@blackboxtmp]$cat Test.java
公开课考试{
公共无效测试(字符串x){
字符串s=(字符串)x;
系统输出打印项次;
}
}
[stephen@blackboxtmp]$javac Test.java
[stephen@blackboxtmp]$javap-c测试
从“Test.java”编译而来
公开课考试{
公开考试();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共无效测试(java.lang.String);
代码:
0:aload_1
1:astore_2
2:getstatic#2//Field java/lang/System.out:Ljava/io/PrintStream;
5:aload_2
6:invokevirtual#3//方法java/io/PrintStream.println:(Ljava/lang/String;)V
9:返回
}
[stephen@blackboxtmp]$
语句
strings=(String)x被编译成一个简单的加载和存储;无
checkcast
指令

如果JIT编译器能够优化掉冗余的
checkcast
。。。如果它看到了



1-。。。手写代码。在生成的源代码中,可以使用冗余类型转换,以便更容易地编写源代码生成器。毕竟,生成代码的可读性在很大程度上是不相关的。

return val.equals(“Y”)
就足够了。是的……不需要这种重复的强制转换。像你和我这样的开发人员犯了错误。感谢您的识别:)Tunaki-I'd of write return“Y”。等于(val)整个示例代码都很糟糕。首先,
AttributeConverter
需要两个类型参数(正如您所期望的,它们是您从/转换到的两种类型),作者忽略了这两个参数。因此,该示例甚至无法编译。然后是不必要的强制转换,蛋糕上的糖霜是
if(boolean){return true;}else{return false;}
construct。请注意,这是另一回事-本文中的代码会在null值上抛出NPE,而这不会。在某些情况下,需要在null值上使用NPE。@eis这两种情况都不会导致NPE,您可以将null强制转换为任何引用类型,而不会得到任何异常@IAN2TEDV,但如果不获得异常,您当然不能在null值上调用val.equals()exception@eis通过此操作,您将无法获得
NPE
。你指的是什么?@RuchiraGayanRanaweera你会在原始代码中看到,所以这并不等同于那个。