タグ

ジェネリクスに関するj5ik2oのブックマーク (6)

  • new T()したいケースへの対処法 - プログラマーの脳みそ

    Javaのジェネリクスの話題のひとつにnew T()したいができないので困る、というテーマがある。 先日のセッションではこの対策についても簡単に述べたが今日はそのまとめ。 まず第一に疑うべきは当にnew T()する必然性があるか?というのが持論だが、ある種のフレームワークではその必然性がある。 O/RマッピングのフレームワークでPOJOにデータを詰めて返したい WebフレームワークでHTTPリクエストをPOJOに詰めてControllerクラスに渡したい (このあたりの議論はJavaのジェネリクスで,T.class や new T() ができず悩んだ話 (型パラメータのインスタンス化に関し、フレームワーク設計からケーススタディ) - 主に言語とシステム開発に関してによくまとまっている) ここで、これらのPOJO(Plain Old Java Object - 端的に言えばデータを格納する

    new T()したいケースへの対処法 - プログラマーの脳みそ
    j5ik2o
    j5ik2o 2013/11/22
    ScalaだとClassTagというよりはHoge.applyを関数化して相手に渡すことが多いから、あんまりこういうことで困らない。
  • Javaで戻り値の型パラメータにワイルドカードを使う意味 - 矢野勉のはてな日記

    java例えば次のようなメソッドを考えてみる。Bookはまあ、独自クラスだとする。 List getBooks(); これを次のようにすることに意味はあるのかどうか。 Listextends Book> getBooks(); メソッドの戻り値にワイルドカードを使ったところで、結局、Bookの固有のサブクラスで結果を受け取れるわけではない。これはコンパイルエラー List books = getBooks(); 受け取るにはこうすることになるでしょう。 Listextends Book> books = getBooks(); Listでは受け取れない(コンパイルエラーになる)。Listから値を取り出す場合、結局のところ、下限型であるBookとしてしか取り出すことはできない。もちろん、booksの中にはBookのサブクラスが入っている可能性もあるけど、サブクラスにするには、instance

    j5ik2o
    j5ik2o 2010/11/15
    インターフェイスのメソッドや抽象メソッドの戻り値によく使いますね。
  • JavaとScalaとC#のジェネリクス機能比較表 - Onion開発しつつ、PEGEXを開発する日記

    JavaScalaとC#のジェネリクスは、いずれも継承を持ったオブジェクト指向言語においてParametric Polymorphismを実現するための手段であり、それぞれ異なった特性を持っている。というわけで、それぞれの言語においてジェネリクスがどのようにサポートされているかを比較した表を用意してみた。後で気が向いたら、各項目の説明を追加するかも。 Java(5.0以降) Scala C#(4.0) ジェネリックなクラス ○ ○ ○ ジェネリックなメソッド ○ ○ ○ 型パラメータの上限 ○ ○ ○ 型パラメータの下限 × ○ × 型パラメータの推論 ○ ○ ○ 全ての型のサブタイプ(ScalaにおけるNothing) × ○ × definition-site variance × ○ ○ use-site variance ○(Wildcard) ○(Existential Typ

    JavaとScalaとC#のジェネリクス機能比較表 - Onion開発しつつ、PEGEXを開発する日記
  • ジェネリクスの代入互換のカラクリ - プログラマーの脳みそ

    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 {} これは図で

    ジェネリクスの代入互換のカラクリ - プログラマーの脳みそ
    j5ik2o
    j5ik2o 2010/11/07
    非常に重要
  • ジェネリクスの代入を理解する その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>(); であれば代入が可能です。 このように、同じ継承階層の型を扱うのにもかかわ

    j5ik2o
    j5ik2o 2010/11/06
    Javaの型パラメータは共変ではないからList<B>にArrayList<C>が代入できない。
  • https://www.itarchitect.jp/technology_and_programming/-/18161-3.html

    j5ik2o
    j5ik2o 2010/11/04
    用語に溺れないように
  • 1