2012-04-16 12 views
13

パラメトリック多形性は、さまざまなデータ(型)にわたって一様なアクションを可能にする技術です。私の知識は正しいですか?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()); 
    } 
    } 
} 

よろしくお願いいたします。

編集:私の例がパラメトリック多形性を特に示していない場合は、1つを入力してください。ありがとうございました。

+0

正しく表示されます。基本的に、CatとDogは、Animalタイプに基づいて実際のタイプに関係なく扱います。 – dvallejo

+2

ハスケラーとして、私はそのパラメトリック多形性と呼んでいません。パラメトリック多相関数は、すべての_parameter_型 'T'に対して同じように動作する' LinkedList reverse(LinkedList ) 'のようなものです。パラメトリック多相関数は、インタフェースメソッドを呼び出すことはできません。 –

答えて

18

「パラメトリック多態性」は、Javaの「ジェネリックス」の別の用語です。考え方は単純です:タイプのが特定のクラスで使用されることを明示している場合、その明確な例はjava.utilパッケージのすべてのコレクションにあります。

Javaでジェネリックのニュアンスを学ぶために、私はAngelika LangerのFAQを強くお勧めします。あなたのコードで

、この行は、ジェネリック医薬品の使用例である:

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

コレクションは動物である任意のオブジェクトを保持するために指定されています。

3

正確に。パラメトリック多形性は、一般にジェネリック/テンプレートを指す。ウィキペディアから

:それは彼らの種類によらず同じ値を処理できるように、パラメトリック多型を用い

、関数またはデータ・タイプは、一般的に書き込むことができます。

+2

なぜこのページ:http://en.wikipedia.org/wiki/Polymorphism_(computer_science)では、亜型の多型性の例を示していますか?サブタイプ多型とパラメトリック多型の違いは何ですか? –

+0

@DannyRancherあなたがしたことは、2番目の考えでは、サブタイプ多型(継承に基づく多型)によく似ています。パラメトリック多態性は、ジェネリックを使用して任意のクラスまたは関数を記述するときに、ジェネリックパラメータとして受け取ることができる複数のクラス(LinkedList など)で動作するようにするときです。 –

+0

@DannyRancher違いを明確にするために私の答えにいくつかの詳細を追加しました。 – trutheality

6

ウィキペディア:プログラミング言語と型理論で

は、パラメトリック多型は、まだ完全な静的な型の安全性を維持しながら、言語より表現にする方法です。パラメトリック多型を使用すると、関数またはデータ型は、その型に依存することなく値を同じように処理できるように、汎用的に記述できます。このような関数およびデータ型は、汎用関数および汎用データ型とそれぞれ呼ばれ、汎用プログラミングの基礎を形成する。

これは、標準的なJavaライブラリコレクションです。

例えば、Collections.sortは次のように宣言されている:それは他のT年代に匹敵するタイプTのオブジェクトのリストを取り、どのようなタイプTを心配することなく、リストを並べ替えることができます

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

は実際にあります。

これは、サブタイプの多型と異なっている:サブタイプの多型はsortListの任意の並べ替え取ることができるという事実によって例示される - ArrayListLinkedListなど

関連する問題