web-dev-qa-db-ja.com

Java(例を含む)のパラメトリック多相とは何ですか?

パラメトリックポリモーフィズムは、さまざまなデータ(タイプ)に対して均一なアクションを可能にする手法であると私は理解しています。私の知識は正しいですか?

この例はパラメトリック多型ですか? Animal.talkでは、特定の動物の種類(猫または犬)に関係なく、トークを呼び出すことができるためだと思います。

public interface Animal
{
  public String talk();
}

public class Cat implements Animal
{
  public String talk()
  {
    return "Cat says Meow!";
  }
}

public class Dog implements Animal
{
  public String talk()
  {
    return "Dog says Woof! Woof!";
  }
}

import Java.util.*;

public class PolymorphismExample
{
  public static void main(String[] args)
  {
    Collection<Animal> animals = new ArrayList<Animal>();
    animals.add(new Cat());
    animals.add(new Dog());
    for (Animal a : animals)
    {
      System.out.println(a.talk());
    }
  }
}

よろしく。

編集:私の例が特にパラメトリック多型を示していない場合は、それを提供していただけますか?ありがとうございました。

16
Danny Rancher

「パラメトリックポリモーフィズム」は、Javaの「ジェネリック」の単なる別の用語です。考え方は単純です。特定のクラスで使用されるtypesを指定します。これの明確な例は、Java.utilパッケージのすべてのコレクションにあります。 。

Javaのジェネリックスのすべてのニュアンスを学ぶには、Angelika Langerの [〜#〜] faq [〜#〜] を強くお勧めします。これは、仕様の隅々まで探求します。

コードでは、次の行はジェネリックスの使用例です。

Collection<Animal> animals = new ArrayList<Animal>();

コレクションは、動物であるオブジェクトを保持するように指定されています。

22
Óscar López

ウィキペディア:

プログラミング言語と型理論では、パラメトリックポリモーフィズムは、完全な静的型安全性を維持しながら、言語をより表現力豊かにする方法です。パラメトリックポリモーフィズムを使用すると、関数またはデータ型を一般的に記述できるため、型に依存せずに値を同じように処理できます。このような関数とデータ型は、それぞれジェネリック関数とジェネリックデータ型と呼ばれ、ジェネリックプログラミングの基礎を形成します。

したがって、優れた例は、標準のJavaライブラリコレクションです。

例えば、 Collections.sortは次のように宣言されます。

public static <T extends Comparable<? super T>> void sort(List<T> list)

他のTに匹敵するタイプTのオブジェクトのリストを取得し、実際にタイプTが何であるかを気にせずにリストをソートできます。

サブタイプのポリモーフィズムとは異なります。サブタイプのポリモーフィズムは、sortがあらゆる種類のList-ArrayListLinkedList、等.

9
trutheality

正確に。パラメトリック多型は、一般的にジェネリック/テンプレートを指します。

ウィキペディアから:

パラメトリックポリモーフィズムを使用すると、関数またはデータ型を一般的に記述できるため、型に依存せずに値を同じように処理できます。

4
Eran Zimmerman