タグ

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

  • ジェネリクスの代入互換のカラクリ - プログラマーの脳みそ

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

    ジェネリクスの代入互換のカラクリ - プログラマーの脳みそ
  • Javaジェネリクス再入門 - プログラマーの脳みそ

    ジェネリクスでは、「型」を変数にした「型変数」というものを取り扱う。型変数で何が嬉しいかというと、メジャーな例ではコレクションAPIが挙げられる。java.util.Listとかjava.util.Mapとかのデータを格納するタイプのユーティリティクラスのことだ。 2004年にJavaのバージョンが5.0となるまでは、Javaにはジェネリクスの機能はなかった。なので、Listにデータを格納し、取得する場合は List list = new ArrayList(); list.add("hello!"); String str = (String) list.get(0); といったソースコードになる。 add()の引数はObject型で宣言されており、どんな参照型でもadd()することができた。 get()の戻り値もObject型で宣言されておりキャストが必要だった。このキャストはプログラ

    Javaジェネリクス再入門 - プログラマーの脳みそ
  • Javaジェネリクスに関する資料メモ - 情報科学屋さんを目指す人のメモ

    タグ Windows  /  インストール  /  Linux  /  設定  /  エラー  /  Java  /  Eclipse  /  AutoHotkey  /  TeX  /  C#  /  VisualStudio2008  /  対策  /  Subversion  /  LaTeX  /  Vista  /  方法  /  CentOS  /  Android  /  Microsoft  /  Windows7  /  Office  /  バージョン管理  /  プログラミング  /  eclipse  /  PowerPoint  /  SSH  /  Ubuntu  /  WindowsVista  /  コマンド  /  ショートカット  /  .NET  /  Desire  /  VisualStudio  /  便利  /  P2P  /  Unix  /

  • ジェネリクスと代入と落とし穴2

    いらっしゃいませ。今日は皆さんわんくま勉強会でしてねぇ。当BARも閑古鳥なんですよ。 でもまぁせっかくですし前回の クイズの続きと行きましょう。Javaのジェネリクスの自信のほどはいかがですか? 前回は List<String> listA = new ArrayList<String>(); List<? extends Object> listB = listA; listB.add(new Object()); というコードでlistB = listAの代入はできるものの、listB.add()でコンパイルエラーとなるということでした。 では、次のコードをコンパイルおよび実行しようとするとどうなるでしょう? List<Object> listA = new ArrayList<Object>(); List<? super String> listB = listA; listB.a

  • ジェネリクスと代入と落とし穴

    今回はちょっとしたJavaのクイズをお出ししましょう。 List<String> listA = new ArrayList<String>(); List<Object> listB = listA; というコードを書いたとき、listB = listAの代入はコンパイルエラーとなります。 さて、なぜでしょう? それでは、次のようなコードを実行するとどうなるでしょうか? List<String> listA = new ArrayList<String>(); List<Object> listB = listA; listB.add(new Object()); listAの参照するオブジェクトとlistBの参照するオブジェクトは同じなのですが…。おやおや? listBにaddすると、listAも同じものですからArrayListにObjectがaddされることになりますね。 このよう

  • 1