Java の Polymorphisim は、サブクラス メソッドをオーバーライドすることで実現できる多くの形式を表します。などのジェネリック値を渡すことができるジェネリックについてArrayList<Object>
。それはポリモーフィズムの概念の一部ですか?乾杯
4 に答える
Java でのポリモーフィズムは、Java では 2 つの方法で実現できます。
- static (オーバーロード - コンパイル時)
- 動的 (オーバーライド - ランタイム)
ご質問について
はい、サブクラスでメソッドをオーバーライドすることで実行できます。オーバーロードとオーバーライドの両方で、引数でオブジェクトをジェネリックにすることもできます。
ジェネリックとポリモーフィズムは 2 つの異なるものです。
ジェネリックは、主にどのタイプが期待されるかを指定するために使用されます。ワイルドカードを使用して、タイプの範囲を定義できます。たとえば、任意のタイプのリスト ( 、)<? extends List>
に適用できます。LinkedList
ArrayList
ポリモーフィズムとは、オブジェクトが多くの型を持つことができるという概念です。したがって、オブジェクトは例として List のインスタンスおよび のインスタンスにすることができますArrayList
。
たとえば、3 つのクラスを想像してください。
public class Animal
public class Dog extends Animal
public class Cat extends Animal
のインスタンスがある場合Dog
、そのオブジェクトは両方ともDog
ANDAnimal
です。
明らかに、 を定義しているかのように、2つは非常にうまく適合し、そのリストArrayList<Object>
に任意のものを追加できますObject
(これはJavaの任意のクラスです)。
ポリモーフィズムはジェネリック型には適用できません。String
extendsですがObject
、ArrayList<Object>
参照には使用できませんArrayList<String>
Object obj = new String(); // OK
ArrayList<Object> list = new ArrayList<String>(); // Not OK
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);
これは、ポリモーフィズムを達成しようとするより良い方法を示しています。実行時ではなくコンパイル時にチェックできる、より安全な方法を作成しました。可能な限りオブジェクトの使用を避けるようにしてください。おそらく、必要に応じて設計または使用できるより優れたインターフェイスがあります。