Main.java
public class Main {
public static void main(String... args) {
String a = null;
String b = null;
Object c = a + b;
System.out.println(c);
System.out.println(c.getClass());
}
}
実行結果
nullnull
class java.lang.String
逆コンパイルすると、理由が分かる。
Main.jad
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Main.java
import java.io.PrintStream;
public class Main
{
public Main()
{
}
public static transient void main(String args[])
{
String s = null;
String s1 = null;
String s2 = (new StringBuilder()).append(s).append(s1).toString();
System.out.println(s2);
System.out.println(s2.getClass());
}
}
StringBuilder
の append()
に置き換えられているからですね。
ちなみに、以下はコンパイルエラー。
Main.java
public class Main {
public static void main(String... args) {
Object c = null + null;
System.out.println(c);
System.out.println(c.getClass());
}
}
コンパイル結果
> javac Main.java
Main.java:3: エラー: 二項演算子'+'のオペランド型が不正です
Object c = null + null;
^
最初の型: <null>
2番目の型: <null>
エラー1個
以下ならコンパイルは通る(結果は同じ)。
Main.java
public class Main {
public static void main(String... args) {
Object c = (String)null + null;
System.out.println(c);
System.out.println(c.getClass());
}
}