を読んで。面白いなーと思って。
プリキュア見ながら実際にコードを書いて確かめてみてる間に解決してたようで良かった。
んでも、byteへのキャストが必要な原因はどこだろう?って思って。
Stream<Byte> sb = Stream.of((byte)0b0000_0001, (byte)0b0000_0010);
Stream特有?
→違う。Stream特有ってわけじゃない。
例えば、こんなん書くとコンパイルエラーになる。
List<Byte> bs = Arrays.asList(0b0001_0010);
SampleTest.java:16: エラー: 不適合な型: 推論変数Tには、不適合な境界があります
List<Byte> bs = Arrays.asList(0b0001_0010);
^
等価制約: Byte
下限: Integer
Tが型変数の場合:
メソッド <T>asList(T...)で宣言されているTはObjectを拡張します
0b0001_0010 ってByteに入れられない?
入る。コンパイルエラーにならない。
Byte b = 0b0001_0010;
0b0001_0010 ってbyteに入れられない?
まぁ、入る。コンパイルエラーにならない。
byte b = 0b0001_0010;
ふむ。
0b0001_0010 ってbyteパラメータとして渡せる?
渡せない!コンパイルエラーになる。
@Test
public void test(){
sample(0b0001_0010);
}
private byte sample(byte b){
return b;
}
SampleTest.java:19: エラー: 不適合な型: 精度が失われる可能性があるintからbyteへの変換
sample(0b0001_0010);
^
あ。ふむ。そうか。
0b0001_0010 ってbyteの範囲を超えるとエラーになる?
うん。なる。
byte b = 0b1_0001_0010;
SampleTest.java:19: エラー: 不適合な型: 精度が失われる可能性があるintからbyteへの変換
byte b = 0b1_0001_0010;
^
まとめ
0b0001_0010 ってintだけど、直接byteに入れる場合は、いい具合にコンパイラが変換してくれるってことなのかな。
こう書くと・・・
byte b = 0b0001_0010;
こんな風になるってことか。
byte b = (byte)0b0001_0010;
だけど、メソッドのパラメータとしてbyteを渡すときは、intで渡されることになって、そうなるとコンパイル時には判断できないってことか。
だから、これはコンパイルエラーになるけど
@Test
public void test(){
sample(0b0001_0010);
}
private byte sample(byte b){
return b;
}
これはならないってことね
@Test
public void test(){
byte b = 0b0001_0010;
sample(b);
}
private byte sample(byte b){
return b;
}
空気読んでくれても良さそうだけど。仕組み上そういうわけにもいかないってことなのかな?
ふーん。面白かった。
2015-07-06追記
バイナリリテラルじゃなくても普通に10進で書いても同じね。メソッドパラメータは、intでオーバーロードがあったときに動きが変わってしまうのを防ぐためかな「JavaのBinary Literalsが空気を読んでくれたりくれなかったり」 http://t.co/Tvg9gmWT9d
— きしだﬗ (@kis) 2015, 7月 6
あ、そうかー。なるほどー。
— パパりんず (@bufferings) 2015, 7月 6
スッキリ!