Javaのリスク考察 2018年版

Java10以降、Java SEのリリースサイクルを6カ月単位とすることが発表されてしばらく経ち、また、予告通りJava11からいよいよJavaのサポート体制も変更となった。 本稿ではJavaを使い続けるリスク、あるいはほかの言語ランタイムを使い続けるリスクについて検…

ジェネリクスと配列

Javaのジェネリクスは一般に配列と混ぜてはいけないとされるが、混ぜて用いた場合に何が問題となるのか。 歴史的な問題 Javaが1995年に登場した当時、Javaに配列はあったがジェネリクスはなかった。ジェネリクスを含む型システムの理論的な整備は、1990年代…

Java Generics Hell - new T()

Java Generics Hell アドベントカレンダー 24日目。 前回(22日目) イレイジャ 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。今回はJavaのジェネリクスでは型変数を用いてnew T()できないけど特に問題ないという話。 コンストラクタの形 コンス…

Java Generics Hell - イレイジャ

Java Generics Hell アドベントカレンダー 22日目。 前回(20日目) ブリッジメソッド 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 メソッドのオーバーロード Javaのジェネリクスのイレイジャについて語るには、まずメソッドのオーバーロード…

Java Generics Hell - ブリッジメソッド

Java Generics Hell アドベントカレンダー 20日目。 前回(19日目) 内部クラスと型変数のスコープ 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 共変戻り値 Java5以降ではメソッドをオーバーライドするときに、戻り値をより具体的な型としてオ…

Java Generics Hell - 内部クラスと型変数のスコープ

Java Generics Hell アドベントカレンダー 19日目。 前回(18日目) ジェネリックな例外 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。Javaでは1ファイルにトップレベルのpublicなclassはひとつしか置けないが、入れ子になったクラスなどを用意…

Java Generics Hell - ジェネリックな例外

Java Generics Hell アドベントカレンダー 18日目。 前回(16日目) 型変数のバインド 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 throws E Java のジェネリクスの型変数は例外のthrows宣言でも用いることができる。型変数の宣言時にthrow可…

Java Generics Hell - 型変数のバインド

Java Generics Hell アドベントカレンダー 16日目。 前回(15日目) ワイルドカード落穂ひろい 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 メソッドスコープの型変数 メソッドスコープの型変数へのバインドについては以前も書いたが再掲して…

Java Generics Hell - ワイルドカード落穂ひろい

Java Generics Hell アドベントカレンダー 15日目。 前回(14日目) http://d.hatena.ne.jp/Nagise/20171214/1513260215=反変ワイルドカード 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。共変ワイルドカードと反変ワイルドカードについて書いた…

Java Generics Hell - 反変ワイルドカード

Java Generics Hell アドベントカレンダー 14日目。 前回(13日目) 共変ワイルドカード 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 反変ワイルドカード さて、前回は共変ワイルドカードについてだった。今回は反変ワイルドカードについてで…

Java Generics Hell - 共変ワイルドカード

Java Generics Hell アドベントカレンダー 13日目。 前回(11日目) 型変数の境界 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 変性 パラメタライズドタイプについては以前に書いたが、ワイルドカードについては後回しということにしていた。<…

Java Generics Hell - 型変数の境界

Java Generics Hell アドベントカレンダー 11日目。 前回(8日目) インスタンススコープのジェネリクス 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。週末サボりました。すいません。 型変数の境界 ここまでは話を簡単にするために型変数の境界…

Java Generics Hell - インスタンススコープのジェネリクス

Java Generics Hell アドベントカレンダー 8日目。 前回(7日目) メソッドスコープのジェネリクス 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。ようやくクラスの型変数の話にたどり着いた。なかなか話題が多くて大変なのである……。 インスタン…

Java Generics Hell メソッドスコープのジェネリクス

Java Generics Hell アドベントカレンダー 7日目。 前回(6日目)ジェネリクスの構文 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。前回、構文の話をしていたが、そのなかでメソッドスコープのジェネリクスをいったんおいていた。 今回はそのあ…

Java Generics Hell - ジェネリクスの構文

Java Generics Hell アドベントカレンダー 6日目。 前回(5日目) パラメタライズドタイプ 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。ここまで話の簡単のためにいろいろ端折って書いてきているのだが、徐々に詳細を書かねばなるまい。同時に…

Java Generics Hell - パラメタライズドタイプ

Java Generics Hell アドベントカレンダー 5日目。 1日目 Java Generics Hell 序章 2日目 オブジェクト指向 3日目 リスコフの置換原則 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 パラメタライズドタイプ Javaのジェネリクス周りは一緒くた…

Java Generics Hell - 配列と変性

Java Generics Hell アドベントカレンダー 4日目。 1日目 Java Generics Hell 序章 2日目 オブジェクト指向 3日目 リスコフの置換原則 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。前回は継承のある型システムで重要な「リスコフの置換原則」…

Java Generics Hell - リスコフの置換原則

Java Generics Hell アドベントカレンダー 3日目。 1日目 Java Generics Hell 序章 2日目 オブジェクト指向 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。前回はオブジェクト指向の中核が(継承に限定せず幅広い意味での)ポリモーフィズムで…

Java Generics Hell - オブジェクト指向

Java Generics Hell アドベントカレンダー 2日目。 1日目 Java Generics Hell 序章 読者の推奨スキルとしてはOCJP Silverぐらいを想定している。前回は与太話だった。ジェネリクスの話をする前にOOP(オブジェクト指向プログラミング)について整理しておか…

Java Generics Hell 序章

気合が続くか分からない Java Generics Hell アドベントカレンダー 1日目。読者の推奨スキルとしてはOCJP Silverぐらいを想定している。 導入 JavaのジェネリクスはJavaが設計された当初(Javaは1995年に発表されている)から検討はされてはいたものの、実装が…

Java本格入門のジェネリクスの用語訂正案

聞くところJava本格入門(通称アクロ本)の評判がすこぶる良いようだ。1995年にJavaが発表されてから随分と経つ。Javaのメジャーバージョンも8を数え、9がリリースされようとしている。1990年代にはこの新しい言語についてたくさんの技術書が発行されたが、…

贖罪のイレイジャ

Javaのジェネリクスでしばしば話題に上がる「イレイジャ」について整理しておきたい。イレイジャについては僕もいろいろと誤解しており、過去に誤った発言をしている。本エントリはその贖罪として書かれたものである。「イレイジャ」という方式についてはネ…

入門書が教えてくれないJava スコープ編

入門書ではあまりとりあげられない部分を解説するコンセプトの「入門書が教えてくれないJava」シリーズの第二弾。前回は変数についてだった。今回はそのスコープについて取り上げたい。 スコープとは スコープとは大雑把に言えば変数やメソッドなどが見える…

入門書が教えてくれないJava 変数編

春なのでJava入門的なことを書こうと思い立ったので、入門書ではあまりとりあげられない部分を解説するコンセプトの入門記事を書いてみようと思う。(←ひねくれ者)対象読者としては、Java言語の基礎を学んだがもう一歩踏み込んだ話が知りたいぐらいの初学者〜…

セミコロンレスJavaコンパイラの設計

すいません。完成まで漕ぎ着けれませんでした。本稿はセミコロンレスJava Advent Calendar 2015の25日目です。セミコロンレスJavaについて簡単に説明すると、Javaの構文上のセミコロンを用いないで標準APIの範囲でプログラミングをするにはどうしたら良いか…

ブリ会の振り返り

富山で寒ブリを買い付けて東京に運び、料理ハンズオンというか、要するにホームパーティーをやろうという企画の振り返り。あくまでもエンジニアの個人的なホームパーティーなのでその点はひとつご理解を。kamekoopa氏の振り返りも参考に。本稿のブリの写真は…

FutureTaskのコンストラクタと魔法のバインド

java.util.concurrent.FutureTaskのコンストラクタの定義が public FutureTask(Callable callable) http://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/FutureTask.html#FutureTask-java.util.concurrent.Callable- とCallable<V>となっていてC</v>…

Java8流インスタンスを生成するメソッドの書き方

メソッド内部で任意の型のインスタンスを生成してオブジェクトを返す場合 public static <T> T hoge(Class<T> clazz) { try { return clazz.newInstance(); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } といったようにjava.la</t></t>…

引数と戻り値の不一致 - ジェネリクス・ケーススタディ

ある型のインスタンスを受け取り、Listにして返すメソッドを考えよう。 public static <T> List<T> wrap(T value) { List<T> list = new ArrayList<T>(); list.add(value); return list; } このとき、型変数はメソッドのIn / Outで型の関連を表現できさえすればよいので</t></t></t></t>…

Mapの置換にみるジェネリクス表現

Javaのジェネリクスについて考察するのに丁度良いテーマを見つけたので忘れないうちに書いておく。Map を Mapに変換するメソッドを作るという話題。 public static <K,V> Map<V,K> swap1(Map<K,V> origin) { // 略 } 単にMapからMapに変換するなら上記のようなメソッドシグ</k,v></v,k></k,v>…