タグ

genericsに関するhiro360のブックマーク (11)

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

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

    Java総称型のワイルドカードを上手に使いこなすための勘所 - 達人プログラマーを目指して
  • Effective Java 読書会 7 日目 「PECS! PECS! PECS!」 - IT戦記

    はじめに 今日読んだところ 126 ページ〜 142 ページ 前回はこちら Effective Java 読書会 6 日目 「ジェネリクス!」 - IT戦記 Object を使ったその瞬間が ジェネリック型を使うチャンスなのです!!! たとえば、以下みたいな public class Stack { /* snip */ public Object pop() { /* snip */ } public void push(Object e) { /* snip */ } } こうなる public class Stack<E> { /* snip */ public E pop() { /* snip */ } public void push(E e) { /* snip */ } } Object を使わなくすると キャストがなくなる キャスト良くない!例外でるからね! どうしてもキ

  • ジェネリクスを使いこなそうゼ - 都元ダイスケ IT-PRESS

    というネタでエントリ書けよゴルァ、とid:happy_ryoに脅されて書くエントリー。 ジェネリクスご存知ですか。使ってますか。アノテーションと共にJava5から現れた、<> で囲まれた変な奴。 全くの余談ですが、アノテとジェネリクスの事を理解していなかったその昔。漠然と「たまに見かけるあの@とか、<> とかって何だろう」と思った訳ですよ。で、どうしようもなくて某所で聞いてみたんですね。そしたらさー、「ググれカス」って言われちゃってさwwww 「Java @」とか「Java <>」で検索してみるわけですよw 無理だろww はい、話し始める前から脱線してる都元ですコンバンワ。 ジェネリクス初心者がまず触れるのは、コレクションですかね。Listとかでお世話になる訳ですね。意図しない型のインスタンスを突っ込まれる心配もなく、取り出し時にキャストする必要もなくなる、なんか嬉しい奴、というイメージだ

    ジェネリクスを使いこなそうゼ - 都元ダイスケ IT-PRESS
  • ジェネリクスの代入を理解する その2

    前回はまず、ジェネリクス型パラメータを伴うList同士の代入互換性について述べました。 今回はそれらのListのadd()メソッドとget()メソッドについて見てきたいと思います。 なお、前回同様に C extends B, B extends A という継承関係があることとして以下話を進めます。 入力値の制約 前回で<? extends B>型には <B>も <C>も <? extends C>も代入できると述べました。 List<? extends B> listBEx = new ArrayList<C>(); ということができるわけですね。 さて、このlistBExにadd()をしてみるとしましょう。 listBEx.add(new B()); 実は、これがコンパイルエラーになるのです。 List<? extends B>型には B型をadd()できないのです! というのも、さきほ

  • ジェネリクスの代入を理解する その1

    Javaのジェネリクスはかなり強力で、相当の型を表現できるのですが、 代償として非常に複雑なものとなっています。 ややこしいのは、オブジェクト指向の部分の型の代入互換性と、 ジェネリクス型パラメータの部分の代入互換性は、表現こそ似ているものの、 その意味するところはまるで違うと言うことにあります。 端的には、C extends B, B extends Aの関係があるとして、 型B にはサブクラスであるCをキャストなしに安全に代入することができます。 B b = new C(); しかし、ジェネリクス型パラメータの場合の List<B> listB = new ArrayList<C>(); はコンパイルエラーとなります。 List<? extends B> listBEx = new ArrayList<C>(); であれば代入が可能です。 このように、同じ継承階層の型を扱うのにもかかわ

  • 続・S2JDBC の弱点を補完するS2AbstractService - 出羽ブログ

    エンティティの結合を検索時に指定することがほとんどなので findByIdやfindAllなんかは実運用では出番があまりないかもです。 AbstractService に次のようなメソッドを用意すれば、結合も汎用的に扱うことができます。 AbstractService.java public class AbstractService<ENTITY> extends S2AbstractService<ENTITY> { public List<ENTITY> findAll(String leftOuterJoin, String orderBy) { return select().leftOuterJoin(leftOuterJoin) .orderBy(orderBy).getResultList(); } public ENTITY findById(Integer id, St

    続・S2JDBC の弱点を補完するS2AbstractService - 出羽ブログ
  • S2JDBC の弱点を補完するS2AbstractService - 出羽ブログ

    このエントリーではSeasar 2.4.26 から 導入された S2AbstractService について書かせて頂きます。S2AbstractService を活用することで、タイプセーフを保ちつつも、データアクセスロジック関連のソースコードを大幅に減らす効果が期待できます。 S2JDBC の弱点 S2JDBCを使えば、お手軽かつパワフルにデータアクセス処理が実現できます。しかし、生のS2JDBCを野放し状態に使った場合、プロジェクトの規模が少し大きくなると、ソースコードの重複を生みやすくなる問題に直面します。具体的に、次の1件分のデータ取得処理ですら、コピー&ペーストされて複数箇所で使用されてしまいます。 Emp emp = jdbcManager.from(Emp.class).id(empId).getSingleResult(); 対処方法は、共通処理を抽出してメソッド化するこ

    S2JDBC の弱点を補完するS2AbstractService - 出羽ブログ
  • Entity単位のServiceに共通の親クラスを持たせる - 出羽ブログ

    どうにかして型パラメータからAbstractServiceのclazzへセットしたかったのですが、やり方わからず。。。 ジェネリックの部分があまりスマートなやり方じゃない気がしていますが、ひとまず以下のやり方だとOKです。 まずはジェネリックな共通親サービスクラスです。 public abstract class AbstractService<E> { // JDBCマネージャー public JdbcManager jdbcManager; // Entityのクラス protected Class<E> clazz; @SuppressWarnings("unchecked") public AbstractService() { Type type = this.getClass().getSuperclass().getGenericSuperclass(); Type[] ar

    Entity単位のServiceに共通の親クラスを持たせる - 出羽ブログ
  • リフレクションでジェネリクスメソッドを扱う

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

  • Genericsとか - しげるメモ

    Java : Generics - lethevert is a programmer あたりを読んで、Genericsって難しいって思う人がたくさんいるんだなと。 確かに難しいけど、それは コンパイラ作るのが大変 フレームワーク作るのが大変 とかその辺の話で、末端の開発者(上の成果を利用する人)はほとんど気にせずに使えると思うのですよ。Javaの仕様が複雑、と言っているほとんどの人は上に関わっている人とか、言語学者?の人なのかなと思います。 たとえば、enumの親であるjava.lang.Enumはジェネリッククラスとして宣言されていて、 class Enum<E extends Enum<E>> 上のような宣言ですが、これを気にする人とかあまりいないのではないかと思います。 それでも、これらを利用する開発者にとっては気がつかないうちにいろいろな恩恵が与えられています。 ほかにも、jav

    Genericsとか - しげるメモ
  • Guiceのソースから学ぶGenerics - レベルエンター山本大のブログ

    GuiceはJavaのGenerics機能をフル活用したタイプセーフなフレームワークです。 私も、当初よりGenerics機能は、Javaの静的型付け言語的良さを強化する素晴らしい機能だと思っていましたが、実用方法としてはCollectionフレームワーク以上のものが思いつきませんでした。 しかし、Guiceはこれ以上ないほどの素晴らしい使いかたでGenericsを使い可能性を示しています。 Genericsの時代はいつか来るだろうと思っていましたが、それもGuiceの登場で案外早く来そうです。 ここでは、Moduleでの処理bind()メソッドと、その戻り値であるAnnotatedBindingBuilderインターフェイスのto()メソッドのソースを読み解いてみます。 そのなかでGnenericsの使い方を学んでいきましょう。 型 メソッド AbstractModuleクラス bind

    Guiceのソースから学ぶGenerics - レベルエンター山本大のブログ
  • 1