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>…

富山合同勉強会お疲れ様でした

富山合同勉強会 .NET & Java 〜ぶりしゃぶで休もう〜 が1/31(土)に開催されました。.NETのセッションとJavaのセッションを2部屋並行してやるという富山ではなかなか例を見ない大規模な勉強会です。いろんな話題があって良かったですね。僕はスタッフとしてJa…

getter/setterとはなんだったのか

Javaのgetter/setterのお話。 僕は当時を語るには若すぎるのだけど、過去を振り返って書いてみる。当時を知る人は誤りがあれば指摘してほしいし、情報があればコメントなりトラックバックなりして欲しい。前世紀の話というのは今となっては探すことがなかな…

Javaの型システムとコンストラクタ

今回はJavaの型システムのコンストラクタについて考えてみたい。Javaの型システム、あるいはJavaのオブジェクト指向において、コンストラクタという存在は特殊な存在だ。コンストラクタ内からはそのクラスのインスタンスフィールドにアクセスできる。これは…

コンパイル時警告に注意

http://aoking.hatenablog.jp/entry/20100427/1272326219での主張は public class Sample { public static void main(String[] args) { List<Integer> list = getList(); System.out.println(list); } public static <T> List<T> getList() { List<T> list = new ArrayList<T>(); </t></t></t></t></integer>…

可変長な型変数の表現

さて、前回のエントリを枕として、JavaでTuple的なモノのサンプルを書いたのだけど、汎用のTupleというか、値を2つだけとるPairとでも名乗るべきモノだった。みなさん御存知の通り、型変数は可変長に宣言することができない。そもそもJavaの文法的には型変…

ふたつのIterator

コードを書いているとたまにふたつのIteratorをいっしょに回すコードを書くはめになる。 /** ふたつのItaratorを並べて回すサンプル */ static boolean compare1(List<String> list1, List<Integer> list2) { if (list1.size() != list2.size()) { throw new IllegalArgumentE</integer></string>…

富山の勉強会に参加する際の心構え

IT勉強会はなにも東京ばかりで開催されているわけではない。 地方の勉強会に参加するのであれば、ついでに観光地を巡ったり、その土地の美味しいモノを食べたいというのが人情である。本エントリでは富山の勉強会に来た際に食べるべきものを紹介する。 氷見…

Java書けるんなら当然JavaScript呼び出せるよね?

上司「Java書けるんなら当然JavaScript呼び出せるよね?さっさとやっておいて」 JavaからJavaScriptを呼び出す Java 6 からスクリプトAPIを通じてスクリプト言語を呼び出すことができる。Java標準でJavaScriptのエンジン Rhinoが組み込まれているので特にイ…

new T()したいケースへの対処法

Javaのジェネリクスの話題のひとつにnew T()したいができないので困る、というテーマがある。 先日のセッションではこの対策についても簡単に述べたが今日はそのまとめ。まず第一に疑うべきは本当にnew T()する必然性があるか?というのが持論だが、ある種の…

Semicolonless Java8

JJUG CCC 2013 Fallの懇親会のLT(ライトニングトーク)でSemicolonless Java8について発表しました。Semicolonless Java とはエクストリームプログラミング(要するにプログラミングの縛りプレイ)でルールは以下のとおりです。 セミコロンを用いてはいけない …

JJUG CCC 2013 Fall でジェネリクスのセッションやりました

資料はslideshareに上げました。ジェネリクスの基礎と クラス設計への応用 ジェネリクスの基礎と クラス設計への応用 from nagise 内容はジェネリクスの基礎的なところから、話題を網羅する感じでかいつまんで紹介といったところです。 セッションの元ネタは…

Javaのジェネリクスとリフレクション応用編

前回から随分と間が開いてしまった。Javaのジェネリクスはイレイジャ方式だけどもクラスにバインドした型の情報が残る場合があるんだよシリーズの第2弾である。具体的にどういう場合にバインドした型が残るのかという話だが、端的に列挙すると以下のものであ…

高階型変数のパラダイム分析

前稿 ジェネリクスのカリー化 - プログラマーの脳みそ では、Javaの内部クラスを利用して複数の型変数をもつジェネリックなクラスをカリー化することができるという話をした。では以前のJavaによる高階型変数の実装 - プログラマーの脳みそで用いた手法はカ…

ジェネリクスのカリー化

関数を扱えるだけでは、モナドを表現するには不十分過ぎる - xuwei-k's blogを見て、言語の型システムの表現力とその限界とはなんなんだろうということをモヤモヤと考えていた。ここで話題になっているのは型変数を持つ型変数という話題である。これを便宜的…

コードクローンと品質

コードクローンと品質について話題になっている。元ネタはこちら。 ソースコードの品質についても、みずほ証券は問題を指摘している。今回のバグがあったプログラム全体について、「ソースコードの著しい重複が見られるなど、エラーの潜在する率が極めて高い…

言語機能としての型、概念としての型

某エントリが型について再考するきっかけになったのは事実だが、個々人の思想の成否を問う気がないのでとくにリンクはしない。ここでは型とは何かという点について僕なりの思想を記しておきたい。 データ型を区別しない世界 ごくシンプルなチューリングマシ…