タグ

ジェネリクスとjavacに関するNagiseのブックマーク (3)

  • javacでヒープ汚染せずに代入文だけでクラッシュ - しげるメモ

    寝ようと思ったら思いついた。 public class Main { public static void main(String...args) { Comparable<?>[] c = method(1, 1L); } static <T> T[] method(T...ts) { return ts; } } これ、javacで警告でないけど実行するとClassCastException発生。言語仕様違反です。 おそらく、new T[ ]するときにreifiableな型の配列作ろうとしてイレイジャ変換かけている(erase(lub(Integer, Long)) = erase(Number & Comparable<...>) = Number としている)のに、戻り値にそれ伝播させてなくてT[ ]のまま使ってる。 明日まとめなおす予定。

    javacでヒープ汚染せずに代入文だけでクラッシュ - しげるメモ
    Nagise
    Nagise 2009/02/12
    ジェネリクス+配列はいろいろ怪しい
  • SunのコンパイラとEclipse JDTで動きが違う(4) - しげるメモ

    型推論の正解が分からない - しげるメモからの派生。 型推論で出現する無限型の取り扱いについて、SunのjavacとEclipseのJDTで微妙に動きが違う。 先ほどのエントリで、 method(T, T)にInteger, Longを渡すと、TはR = Number & Comparable<? extends R>となるような型Rに推論されると予測してます。それを踏まえて、現行のコンパイラがどうやって無限型を取り扱ってるのかなーと調査中。 void test() { Integer a = 1; Long b = 1L; bound0(a, b); bound1(a, b); bound2(a, b); bound3(a, b); infinite(a, b); } <T> void bound0(T a, T b) {} // 境界なし <T extends Number & Com

    SunのコンパイラとEclipse JDTで動きが違う(4) - しげるメモ
    Nagise
    Nagise 2009/02/02
    Hoge<T extends Hoge<T>>みたいなのは「無限型」って言うのか。典拠どこだろ。経験則で言うとジェネリクスの無限型まわりはいろいろと挙動が胡散臭い。
  • 型推論の正解が分からない - しげるメモ

    自分めも。だけどわかる人教えてください。 public static void main(String...args) { Integer a = 1; Long b = 2; Object result = method(a, b); // resultの型は? } static <T> T method(T a, T b) { return null; } このmethod(a, b)の型推論で、Tはどのような型に算出されるかという問題。 15.12.2.8 Inferring Unresolved Type Argumentsを追いかけながら進んでいく感じ。ただし、型推論の後半部分だけ。 おさらいしておくと、Integer, Long はそれぞれ下記のような宣言。 class Integer extends Number implements Comparable<Integer>

    型推論の正解が分からない - しげるメモ
    Nagise
    Nagise 2009/02/02
    型変数Tがあって、二つの引数(T a, T b)をとるメソッドでaとbに違う型を充てて型推論…。その発想はなかった。
  • 1