タグ

typeに関するdaisuke-mのブックマーク (19)

  • Javaのジェネリクスとリフレクション - プログラマーの脳みそ

    今回のテーマはジェネリクスとリフレクション。Javaのジェネリクスはイレイジャ方式なのでリフレクションでは何も得られないと思ってはいまいか。 public void hoge(List<String> list) {} といったメソッドがあったとして、リフレクションでこのメソッドの情報を得るとしよう。 import java.lang.reflect.*; import java.util.List; public class ReflectionTest { public static void main(String[] args) throws Exception { Method m = ReflectionTest.class.getMethod("hoge", List.class); Type[] types = m.getGenericParameterTypes(); f

    Javaのジェネリクスとリフレクション - プログラマーの脳みそ
  • ジェネリクスの基礎と応用 JJUG CCC 2012 Fall

    1. ジェネリクスの基礎と応用 Twetter : @nagise はてな : Nagise 所属  (株) Abby  java-ja  北陸エンジニアグループ 2. ジェネリクスのスコープ メソッドの中でのみ有効なジェネリクス public static <T> void hoge(T t) { … } インスタンスの中でのみ有効なジェネリク ス class Hoge<T> { Tt; ... }

    ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
  • 30分で分かる!初心者からはじめる共変・反変講座

    ぐるぐる系SQL @bleis @ufcpp ありますよ。複数レベルのインターフェイスを用意しておいて・・・とか、インターフェイスを介して使うときは見せることができないけど、クラスを直接使うときは見せたい(package privateの時によく使う)とか色々と 2011-11-14 23:45:44

    30分で分かる!初心者からはじめる共変・反変講座
    daisuke-m
    daisuke-m 2011/11/28
    この辺が飲み込めずにJavaのgenericsを本格的に使いだすと大抵ハマりますよね。
  • ScalaにおけるJavaのインターフェースって?

    t_yano @t_yano Scalaについてはtraitとか構造型についていろいろ聞いてみたいことがあるんだけどとても140文字では表せないな…。まあ、スタイルというか定石とかがどうなってるのか知りたい系の話だけど。 2011-10-24 01:31:09 t_yano @t_yano なんか実装継承するケースばかりを見かけるのたけど、型を定義するためにtraitを使うとか、すべてのクラスはなんらかのtraitを型として持つべきだ派とか、あるいは逆に、すべての引数は理由がない限り構造的部分型にすべき派とか、そういう話はないんだろうか的な疑問。 2011-10-24 01:34:22 t_yano @t_yano あるいはあるクラスを受け取ると定義されている関数に、その型ではないけど事実上その方として振る舞える別の型のオブジェクトを、なんらかの方法で渡すことが可能なので、関数インタフェー

    ScalaにおけるJavaのインターフェースって?
  • Java7 のダイアモンドオペレータと型推論について。

    kmizu @kmizu http://bit.ly/n09Sre ちょっとこれを読んで思った事。newするときに、 new ArrayList<? extends String>(); ができないのは、自然というか当然のように #java 2011-07-31 15:31:24 kmizu @kmizu 思っていた。というのは、? extends Stringなんて型は、「ファーストクラスの型としては」存在しないから。というのが1点。あと、new java.util.ArrayList<? extends String>(); って一体何をnewしたいのかって話がある。 2011-07-31 15:35:05

    Java7 のダイアモンドオペレータと型推論について。
    daisuke-m
    daisuke-m 2011/08/06
    超ディープ。。
  • Java総称型のワイルドカードを上手に使いこなすための勘所 - 達人プログラマーを目指して

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

    Java総称型のワイルドカードを上手に使いこなすための勘所 - 達人プログラマーを目指して
    daisuke-m
    daisuke-m 2011/03/27
    あと1年くらい早くこのエントリを読みたかったw 理解するの苦労したんだぜぃ。。。
  • Javaによる高階型変数の実装 - プログラマーの脳みそ

    高階関数というものをご存知か。関数自身を引数あるいは戻り値に取る関数のことである。「高階」は「こうかい」と読む。その昔「たかしな」と読んだ人がいたとか、いないとか。 先のエントリ「HttpSessionを型安全にする」では「javax.servlet.http.HttpSessionのsetAttribute()/getAttribute()のようなモノをどうやって型安全にするか」という動機付けから、 public class KeyValue<K> { public <T> void put(K<T> key, T value){} } といったことをやろうとして、Javaの言語仕様上、型変数に型変数を持たせることができないので実現できないと述べた。 簡単に解説すると、ここでKayValueはHashMap的なキーを渡せば値を返すオブジェクトで、型変数Kはキーの集合体を表現している。ty

    Javaによる高階型変数の実装 - プログラマーの脳みそ
    daisuke-m
    daisuke-m 2011/01/25
    どう見ても変態的だwww 恐れ入ったwww
  • 「クラスはオブジェクトの集合である」についての疑問 - @katzchang.contexts

    Aクラスは全てのAクラスのインスタンスの集合である かつ、 Set<A>のインスタンスは特定のAクラスのインスタンスの集合である ⇒ Set<A>のインスタンスはAクラスの部分集合である …となるが大丈夫か?というのが自分の疑問です。 継承は害悪か。 - Togetterや、TDDBC名古屋で夜にid:rf0444ともお話していた話題ですわね。昨日から今日にかけて、Twitterでいろいろやってたお話です。 「型は集合である」という定義もあるそう*1なので、関連するとは思うけど、型の世界は勉強不足なのでよくわかっていません。が、上記の「Aクラス」を「型A」と読み替えても割といいのかなというイメージではいます。 クラスとそのサブクラスとの関係のみを考えた場合は、「クラスはオブジェクトの集合である」というのは割と自然だったりする…んですかねぇ。 どうでしょうか。 ブコメより id:hoxo_m

    「クラスはオブジェクトの集合である」についての疑問 - @katzchang.contexts
    daisuke-m
    daisuke-m 2011/01/07
    この辺は妙に難しい。複数の概念に同じ「集合」っていう名前がついている可能性とか、同じ概念に色々な名前がついている可能性とかが怪しいとか思ってるけど、頭悪いのでよくわからんw
  • インターフェースとダックタイピングについてちょっと考えてみる - 宇宙行きたい

    こんにちは!! ヨシオリです!! Java Advent Calendar -ja 2010 : ATND の 29 日目になります!! え? クリスマスで終りじゃないの?? まぁ,いいじゃないですか,適当にダラダラ続けてもw ちなみに ATND の URL のイベント ID 的なのが 11000 なのですごいですね!! というわけで,個人的には Java の中でも 1,2 を争うくらい好きなインターフェースについて書きます!! まずは WEB+DB PRESS Vol.60 をヨムノデス WEB+DB PRESS Vol.60 作者: まつもとゆきひろ,西尾泰和,山田憲晋,城戸忠之,増井俊之,羽生章洋,uupaa,ミック,塙与志夫,原悠,奥一穂,はまちや2,大沢和宏,吾郷協,浜階生,中島拓,中島聡,矢野りん,角田直行,能登信晴,田村哲也,吉村譲,結城亜砂子,角谷信太郎,石橋秀仁,WEB

    インターフェースとダックタイピングについてちょっと考えてみる - 宇宙行きたい
    daisuke-m
    daisuke-m 2010/12/30
    面白いなぁ。
  • Javaの型パラメータ境界指定を使って型を合成する話 - 矢野勉のはてな日記

    Javaはい。開発者のあいだでAdvent CalendarがはやってるみたいなのでJavaでもやろうという話があり、早速はじめることにしました。Java Advent Calendar -ja 2010 : ATNDほんとは1日からはじめるものらしいんですが、いいじゃないですかそんなこと。5分で考えて5分でかけるものでOK、ということで、最近遊んでた、Javaで型を合成する話を書いてみようと思います。ネタがぱっと思いつかなかった…あらかじめ書いておくと「できるかなと思ったけどやっぱりできなかったね」という話に過ぎませんのでよろしく。戯れ言です。真剣に読むと損します。あと5分で書けませんでした。型合成Javaでインターフェイスをきるとき、メソッドの引数はおおむねすべてインターフェイスになるように設計するのがよいとされているようです。そうしてると「このメソッドの引数はMapだけど、このMap

    daisuke-m
    daisuke-m 2010/12/13
    いきなり濃いめの来たw
  • Java共変戻り値メモ(Hishidama's Java covariant return type Memo)

    共変戻り値型(covariant return type) 共変ってあんまり聞かない言葉だけど。 メソッドをオーバーライドした際、戻り値の型が(JDK1.4までは一致している必要があったが、JDK1.5から)サブクラスに出来るようになった。 ちなみに、共変の反対は「反変(contravariant)」と言うらしい…が、それはJavaとは無関係^^; 具体例(インターフェース) interface Interface { public Number getValue(); } class Implement implements Interface { public Integer getValue() { //戻り値の型にサブクラスを指定 return 123; //自動ボクシング } } この例では、インターフェースでは戻り値をNumberで宣言しているが、その実装ではNumberのサブ

  • Javaで戻り値の型パラメータにワイルドカードを使う意味 - 矢野勉のはてな日記

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

  • 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を開発する日記
    daisuke-m
    daisuke-m 2010/11/10
    どこまでもディープで面白い。
  • ジェネリクスの代入互換のカラクリ - プログラマーの脳みそ

    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ジェネリクス再入門 - プログラマーの脳みそ
    daisuke-m
    daisuke-m 2010/11/06
    これはいいまとめ。
  • 合ってたらしい - しげるメモ

    型が合ったぁぁ - 設計と実装の狭間で。のフォローアップ。 オーバーライドの共変戻り値型と、パラメータ化型のサブタイピングを組み合わせた感じです。 共変戻り値型 8.4.8 Inheritance, Overriding, and Hiding 一言で言うと、オーバーライドしたメソッドは、親クラスのメソッドのサブタイプを返してOK。 interface A { Number f(); } interface B extends A { Integer f(); // ok } サブタイピング 4.10.2 Subtyping among Class and Interface Types 4.5.1.1 Type Argument Containment and Equivalence パラメータ化型が絡むと多少厄介です。ただ、使えると便利なのでぜひ。 まず、演算子の定義。 「U 「U <

    合ってたらしい - しげるメモ
  • variantという単語から派生した色々な単語の整理

    なぎせ ゆうき @nagise 共変 (covariant)反変 (contravariant) 非変(non-variant)という用語があるのか。これは便利だが意図が通じるかは疑問だな。 2010-11-06 16:48:26

    variantという単語から派生した色々な単語の整理
  • subtype / covariant / contravariant - soutaroブログ

    subtypeと書いて「部分型(特種型)」と言うようです。多分、普通サブタイプで通じると思います。サブタイプというのは「ある型Aをある型Bとして扱っても大丈夫なとき、AはBのサブタイプであると言い、A <: Bなどと表記する」といった概念です。JavaやC#の世界では、(あとで考えるGenericsを省けば)サブクラスの関係とほぼ一対一に対応します。(StudentがPersonのサブクラスのとき ⇒ StudentをPersonだと思っても大丈夫 ⇔ StudentはPersonのサブタイプ ⇔ Student <: Person) さて、それでは関数のサブタイプを考えてみましょう。 X = A -> BとY = A' -> B'という型X,Yがあったとき、X <: Yとなるのは、A' <: AかつB <: B'が成り立っているときです。ここで、BとB'に関してはXとYの関係がそのまま引

    subtype / covariant / contravariant - soutaroブログ
  • ジェネリクスの代入を理解する その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>(); であれば代入が可能です。 このように、同じ継承階層の型を扱うのにもかかわ

    daisuke-m
    daisuke-m 2010/11/06
    ここは個人的にOK。ただ、めんどくさいよねぇ。
  • 1