4

Java の Polymorphisim は、サブクラス メソッドをオーバーライドすることで実現できる多くの形式を表します。などのジェネリック値を渡すことができるジェネリックについてArrayList<Object>。それはポリモーフィズムの概念の一部ですか?乾杯

4

4 に答える 4

3

Java でのポリモーフィズムは、Java では 2 つの方法で実現できます。

  1. static (オーバーロード - コンパイル時)
  2. 動的 (オーバーライド - ランタイム)

ご質問について

はい、サブクラスでメソッドをオーバーライドすることで実行できます。オーバーロードとオーバーライドの両方で、引数でオブジェクトをジェネリックにすることもできます。

于 2012-12-20T11:26:07.570 に答える
3

ジェネリックとポリモーフィズムは 2 つの異なるものです。

ジェネリックは、主にどのタイプが期待されるかを指定するために使用されます。ワイルドカードを使用して、タイプの範囲を定義できます。たとえば、任意のタイプのリスト ( 、)<? extends List>に適用できます。LinkedListArrayList

ポリモーフィズムとは、オブジェクトが多くの型を持つことができるという概念です。したがって、オブジェクトは例として List のインスタンスおよび のインスタンスにすることができますArrayList

たとえば、3 つのクラスを想像してください。

public class Animal

public class Dog extends Animal

public class Cat extends Animal

のインスタンスがある場合Dog、そのオブジェクトは両方ともDogANDAnimalです。

明らかに、 を定義しているかのように、2つは非常にうまく適合し、そのリストArrayList<Object>に任意のものを追加できますObject(これはJavaの任意のクラスです)。

于 2012-12-20T11:23:23.750 に答える
2

ポリモーフィズムはジェネリック型には適用できません。StringextendsですがObjectArrayList<Object>参照には使用できませんArrayList<String>

Object obj = new String(); // OK
ArrayList<Object> list = new  ArrayList<String>(); // Not OK
于 2012-12-20T11:22:16.100 に答える
1

Object をポリモーフィズムに使用することは、Java では悪いパターンと見なされます。インターフェイスが提供するような保証や型の安全性は提供されません。

List<Object> animals = new ArrayList<Object>();
animals.add(new Sheep());
animals.add(new Cat());
// This will throw us an error! (ClassCastException)
Cat cat = (Cat) animals.get(0)

上記のエラーはコンパイル時にキャッチできず、実行時にエラーが発生した場合にのみスローされます。Animal インターフェイスを作成していれば、このエラーを完全に回避できたはずです。

interface Animal {
     //other methods you need to hide through polymorphism
     void sound();
}
List<Animal> animals = new ArrayList<Animal>();
// Sheep and Cat implement the Animal interface
animals.add(new Sheep());
animals.add(new Cat());
// No error
Animal animal = animals.get(0)
// This will through a COMPILE TIME error
Cat cat = animal.get(1);

これは、ポリモーフィズムを達成しようとするより良い方法を示しています。実行時ではなくコンパイル時にチェックできる、より安全な方法を作成しました。可能な限りオブジェクトの使用を避けるようにしてください。おそらく、必要に応じて設計または使用できるより優れたインターフェイスがあります。

于 2012-12-20T11:43:18.530 に答える