タグ

genericsとsyntaxに関するoinumeのブックマーク (8)

  • GoのGenerics関連プロポーザル最新状況まとめと簡単な解説

    記事では、GoのGenerics関連のProposal一覧のまとめと、簡単な解説を行います。 内容については随時更新を行います。 (記事の内容をGo 1.17 リリースパーティーにて発表しました。) Generics関連のProposal一覧 (2022/2/3 更新) GoGitHub Issueと、Gerritから見付けたGenerics関連のProposalを表にまとめました。 Proposal Status Author GitHub Issue Design Doc / Gerrit

    GoのGenerics関連プロポーザル最新状況まとめと簡単な解説
  • Go の "Type Sets" proposal を読む

    Intro 読者の想定知識 この記事で出てくるGo言語仕様用語 サマリー Context Type Parameters Proposalの要点 Type listの必要性 暗黙的な"underlying type matching"の問題 type listからsum typeへ underlying type matchingと代入可能性 underlying type matchingと型switchステイトメント underlying type matchingの表現力の限界 Type Sets Proposal Type sets(型集合) 型Tがinterface ITを実装するための条件 要素を埋め込んだインタフェースのtype set interface elements(インタフェース要素) 任意の型(インタフェース型に限らない) approximation elemen

    Go の "Type Sets" proposal を読む
    oinume
    oinume 2021/07/29
    深い説明だけどわかりやすい
  • TypeScriptの目玉機能「ジェネリック(Generics)」はこうなっている

    JavaScriptのスーパーセットである「TypeScript」。その言語機能として追加されたものの中で、特に注目度が高い「ジェネリック(Generics)」の言語仕様や機能内容を紹介。 2013年のTypeScriptの進化の中で比較的大きな機能強化といえば、ジェネリックを置いて他に無い。ジェネリックとは、いったい何だろうか。なぜ重要なのだろうか。まずそこから説明を始めよう。 型を抽象化するジェネリック C#などの知識があり、「ジェネリックの機能」と意味を分かっている読者は、ここを読み飛ばしてもよい。明確な型の概念を持たないJavaScriptを使ってきて、型の扱いにまだ慣れていない読者のために、簡単に「ジェネリックの意義」を説明してみよう。 ジェネリックは簡単に言えば、型引数を使用して、実際に利用されるまで型が確定しないクラスや関数を実現するためのものだ。 しかし、型引数とは何だろう

  • ジェネリクス型変数と型階層 - プログラマーの脳みそ

    @masaru_b_cl とジェネリクスの話をしていて、継承の際に型変数に具体的な型をバインドして単純化したりするんだよ、みたいな話をしていたのだけど、コード例がないとイメージしにくいと思うのでちょっと書いておこう。 二つの型変数 I, O をもつinterfaceがあったとする。 public interface Executor<I, O> { O exec(I in); } この実装クラスとしてListを受け取って合計を返すSumIntegerクラスを考えよう。 public class SumInteger implements Executor<List<Integer>, Integer>{ public Integer exec(List<Integer> in) { int ret = 0; for (int value : in) { ret += value; } re

    ジェネリクス型変数と型階層 - プログラマーの脳みそ
  • ジェネリクスの代入互換のカラクリ - プログラマーの脳みそ

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

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

    2025年6月7日(土) JJUG CCC 2025 Spring お疲れさまでした。登録者は1000人を超えたようで、会場もなかなかの人手だったかと思います。タイムテーブルを見るとよく分かりますが、8トラックも並行しているのでどのセッションを見ようか悩ましかったのではない…

    記事一覧 - プログラマーの脳みそ
  • 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総称型メモ(Hishidama's Java Generics Memo)

    メソッドの総称型 メソッドのみに総称型を適用した定義を行うことも出来る。[2007-06-12] 戻り値の型の直前に「<仮型引数, 仮型引数…>」を置くだけ。後はクラスの場合と同様。 public static <T> T notNull(T arg1, T arg2) { T ret; if (arg1 != null) { ret = arg1; } else { ret = arg2; } return ret; } このメソッドを呼び出す側は、クラスの場合とは異なり、明示的に型引数を指定する必要は無い。 指定した引数の値に応じて、自動的に型が判断される。 String s = notNull("abc", "def"); //型引数はString Long l = notNull(new Long(1), new Long(2)); //型引数はLong int i = notNu

  • 1