2011-06-23 2 views
1

どちらアンダースコア:numberクラスのvalueOf/parseメソッドがJava 7の有効な数値を拒否するのはなぜですか?

scala> java.lang.Float.valueOf("1_2_3.4_5_6") 
java.lang.NumberFormatException: For input string: "1_2_3.4_5_6" 
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1242) 
    at java.lang.Float.valueOf(Float.java:416) 

もバイナリリテラル仕事:

scala> java.lang.Byte.valueOf("0b01010101") 
java.lang.NumberFormatException: For input string: "0b01010101" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:492) 
    at java.lang.Byte.parseByte(Byte.java:148) 
    at java.lang.Byte.valueOf(Byte.java:204) 
    at java.lang.Byte.valueOf(Byte.java:230) 

これらのメソッドは、Java言語の変更のために更新されなかった理由は何ですか?

(私は実際にはOpenJDKの64ビットサーバーVM、Javaの1.7.0_136-のIcedTeaで働いています。)

答えて

3

私はDoubleを見ました。

Java 7のvalueOfメソッドで指定された構文は、Java 6のvalueOfメソッドから変更されていません。Java 7のAPIは、下線が許可されていないことを特に示しています。

下線は、numeric literalsに許可されます。解析可能な文字列ではありません。これは、Java識別子による@ Vooの意味の可能性が高いです。

+0

それは正しい議論であるかどうか疑問に思います。 Java 7のJava言語仕様は更新されておらず、実際にはリリース2週間前です。 – soc

+1

@soc私は、あなたがAPIによって指定された以上のものを期待するべきではないと主張します。 – Atreys

0

まあ、すべてのほとんどは、あなただけのあなたので、公開APIの署名を変更することはできませんので、それらのメソッドは、Javaの識別子ではなく、数値を解析するために存在します。したがって、言語仕様がその点で変更されているため、 tは、浮動小数点/整数の解析を変更する必要があることを意味します。

また、Integer.valueOfはこれまでのところ「0x」を受け入れていないので、今すぐ開始する必要はありません。

+0

a)署名をどのように変更しますか? b)なぜ「数字」ではなく「Java識別子」とみなされますか? – soc

+0

関数の動作が明らかにインタフェースの定義の一部であるという意味での "署名"。以前は無効であった有効な入力を宣言すると、それが明らかに変更されます。それは、すべての安定したAPIにとって悲惨なことです。 b)について - 通りに行き、人々に "1_2_3"と数字を数えるかどうか尋ねます - ほとんどの人はそうではありません。言語仕様は、ソースコード内で有効な数字として受け入れるものを変更しました。入力を解析するときに何を構成するのかとは関係ありません。 – Voo

関連する問題