タグ

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

  • Xmas Java - よねのはてな

    以下のsourceはcompileが通るでしょうか? public class Xmas { <T> T func1() { return this.func2(); } <T> T func2() { return null; } } 試しにコンパイルしてみると yone098>javac Xmas.java Xmas.java:6: 型パラメータ <T>T を判別できません; 型変数 T (上限 T,java.lang.Object) の固有の最大インスタンスが存在しません。 return this.func2(); ^ エラー 1 個 EclipseでOKなのに、mvnでコンパイル出来ないという経験した方もいるのではないでしょうか。 型パラメータTくらい、判別出来るじゃんと思いますが、出来ない子です。 すぐ分かった方は、SunのJDKマニアですね。 こういうときは、以下のように変更し

    Xmas Java - よねのはてな
  • 型に属する情報をジェネリックに扱う試み - プログラマーの脳みそ

    Generics 勉強中 - しげっと! 妥協案 - しげっと! Integer.MAX_VALUE で Integer の最大値をとってくるみたいに、 // このソースはコンパイル通らないので参考にしないでね。 class Values <T> { private T max, min; public Values() { this.max = T.MAX_VALUE; this.min = T.MIN_VALUE; } public T getMax() { return this.max; } public T getMin() { return this.min; } } class ValuesTester() { public static void main(String[] args) { Values <Byte> obj = new Values<Byte>(); Sy

    型に属する情報をジェネリックに扱う試み - プログラマーの脳みそ
  • ジェネリクスを実装するには - プログラマーの脳みそ

    ジェネリクスとは何か、ということをちょっと考えていた。以下、頭の中の思考をそのまま引っ張り出した文章なので読みにくいかもしれないが勘弁してほしい。 メソッドのI/Oに対して、あるプレースホルダを置き、そのメソッドを使う側でそのプレースホルダの部分に対してのキャストを漏れなく行ったのだとしたら、それはジェネリクス足りうる。 このメソッドを使う場所を漏れなく、というのはアスペクト指向だから、アスペクト指向が実はジェネリクスの要件ではないかと着想した。 さて、単にメソッドのI/Oつまるところ、引数と戻り値の型だけ合わせればよいのであれば、さほど難しいわけではないが、JavaやC#のジェネリクスはメソッドの集合であるクラスというものに対してジェネリクス型パラメータを与えることができる。 これは、ある種のメソッドの集合を考えて、プレースホルダが置け、アスペクト指向により該当箇所を網羅すれば済む。 さ

    ジェネリクスを実装するには - プログラマーの脳みそ
    monjudoh
    monjudoh 2008/11/11
    ジェネリックは実はアスペクト指向だという説。
  • ジェネリクスの代入を理解する その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()できないのです! というのも、さきほ

    monjudoh
    monjudoh 2008/08/20
    『? super B』とかがなぜ必要なのかがとてもよく分かった。
  • ジェネリクスの代入を理解する その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>(); であれば代入が可能です。 このように、同じ継承階層の型を扱うのにもかかわ

    monjudoh
    monjudoh 2008/08/19
    『? extends B』とか『? super B』を絵で分かりやすく
  • IBM Developer

    IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science, AI, and open source.

    IBM Developer
  • 1