タグ

Javaとgenericsに関するigaiga07のブックマーク (6)

  • Java総称型のワイルドカードを上手に使いこなすための勘所 - 達人プログラマーを目指して

    Java5以降では総称型(generics)がJava言語に導入されています。総称型自体は、最近の静的な型付けのプログラミング言語で珍しいことではなく、現在の最新版では.NETのC#やVisual Basicにも導入されています。一般的には総称型をサポートするクラスライブラリを自分で正しく定義することは非常にスキルがいるが、事前に定義されたクラスを使うだけであれば、それほど難しくないとされています。しかし、Java言語の総称型はエントリで説明するように特殊なところがあり、単に利用するだけでも他の言語に比べて遥かに難しいところがあるというのも事実です。特に総称型をパラメータ化する際に指定するワイルドカード型(List<? extends Serializable>など)の意味を正しく理解して使いこなすことは簡単なことではありません。その結果、昔のJDK1.4までのように型パラメーターのない

    Java総称型のワイルドカードを上手に使いこなすための勘所 - 達人プログラマーを目指して
  • ジェネリクスの代入互換のカラクリ - プログラマーの脳みそ

    Javaジェネリクス再入門 - プログラマーの脳みそでは、「変数の型の宣言」の項で「ジェネリクスの<>の中は一般のJavaの型の代入互換性とは異なる。このことはよく覚えておかなくてはいけない。」と言ったものの、深入りはしなかった。 このあたりについて深入りしてみようじゃないか。 とりあえずサンプルコードはJavaで記述していくが、このあたりはジェネリクス指向の概念の部分だから、あまり言語に依ることはない。便宜的にJavaで書く、としておこう。 まず、型変数の境界について考えるために以下の継承関係のクラスを用意しておく。 public class A {} public class B extends A {} public class C extends B {} public class B2 extends A {} public class C2 extends B {} これは図で

    ジェネリクスの代入互換のカラクリ - プログラマーの脳みそ
  • ジェネリックなクラスの階層を遡って適用された具象型を得る

    イレイジャではジェネリクスの何が消えるのかにて親クラスを継承する際に投入しているジェネリクス型パラメータはclassの情報として残っていることを述べました。 これを利用すると、 public class A<X> { public class B<Y> extends A<Y> { public class C extends B<String> { といった継承階層があった場合に、C.classからA.classの<X>にどのような具象型が適用されているのか(上記例ではString型)をリフレクションで取得することができます。 Aの型パラメータのプレースホルダ<X>を取得 Bでsuper-classの型パラメータに渡されたTypeを取得 2のTypeが具象型ではなく型パラメータ<Y>なのでさらにサブクラスを走査 Cでsuper-classの型パラメータに渡されたTypeを取得 B<Y>の

  • 【コラム】ライトニングJava (20) Generic Java(1) - 賛否両論? ジェネリックプログラミングとは | エンタープライズ | マイコミジャーナル

    これまでJ2SE 5.0で導入されたEoDとしてAutoboxing/Unboxing、可変長引数、列挙型、拡張for構文などをとりあげてきた。これらEoDは従来の機能へのSyntax Sugarであることを紹介した。これらEoDは比較的ソースコードの記述の視点に基づいたEoDだといえる。 JavaはJ2SE 5.0からGeneric Javaが導入され、そのプログラミングスタイルに変化が表われている。これは好む好まずに関係なく、Javaを扱う上で習得しなければならない機能のひとつとなった。今回からしばらくの間は、いままで紹介したEoDとは一風異なるGeneric Javaについて紹介する。 ジェネリックプログラミング Javaはオブジェクト指向のプログラミング言語だ。文法はC/C++によく似ていて、静的で強い型付けを行うプログラミング言語に分類される。ジェネリックプログラミングは、こうし

  • リフレクションでジェネリクスメソッドを扱う

    ふと訪れたblogで 共変戻り値(covariant return types)を話題にしていたのですが、 「コレ、JavaSE5.0からだったっけ?1.4だったような」、と思って調べるとやっぱり5.0でした orz 調べるとかつのりさんところ( 共変戻り値)で書いているなぁ…。 自分の中でなぜか1.4だと思い込んでいる様子。この記憶はどこからやってきたのか…。 このあたりを見て、そういえばジェネリクスとリフレクションの話題があったなぁと思いだしたのでひとつ小噺を。 ジェネリクスの具象化とメソッドシグニチャ さて、気を取り直して、この共変なオーバーライドですが、ジェネリクスの実装にはなくてはならないものです。 public interface Sample<T> { T hoge(); void piyo(T t); } といったジェネリクス型パラメータを持つinterfaceがあったとし

  • Java5.0新機能のお勉強(2) - SEの行き着くところ…

  • 1