2

インスタンスを特定の型として宣言する目的で少し混乱しています。例えば、

Integer intOb1 = new Integer(3);
Object intOb2 = new Integer(4);

のタイプとのタイプintOb1は知っていますが、宣言することで何ができるようになりますか??のメソッドを使用します あなたはすでにそれらのメソッドをとして使用することはできませんか?それとも、オブジェクトとして「扱う」ことができるようにすることが主な目的ですか?IntegerintOb2ObjectintOb2ObjectObjectIntegerintOb2

ご覧のとおり、私は困惑しています。

4

3 に答える 3

2

この実際はキャスティングとは呼ばれません。これはポリモーフィズムの例です。これにより、変数は他のクラスとの継承関係に基づいてさまざまな型をとることができます。

たとえば、動物園をシミュレートするプログラムを作成しているとします。と呼ばれるクラスとZooと呼ばれるクラスがありAnimalます。クラスから拡張するいくつかのクラスもありますAnimalLion、、、ZebraおよびElephant

これらのオブジェクトをすべて1つのリストにグループ化しておくと非常に便利ですが、タイプが異なるため、、、、およびLion、を1つのリストに保存することはできないため、別のリストを維持する必要があります。動物の種類ごとに。ここでポリモーフィズムが作用します。ZebraElephant

各クラス、、、LionおよびZebraすべてがクラスElephantから拡張されているためAnimal、タイプのリストにそれらを簡単に格納できますAnimal

コード例:

public class Zoo
{
   private List<Animal> animals; 

   public Zoo()
   {
      this.animals = new ArrayList<>();
   }

   //notice this method takes an Animal object as a parameter
   public void add(Animal a)
   {
      this.animals.add(a);
   }
}

public abstract class Animal
{
   private String name;
   private String type;

   public Animal(String name, String type)
   {
      this.name = name;
      this.type = type;
   }

   //all subclasses must implement this method
   public abstract void speak();
}

public class Lion extends Animal
{
   private String animalType = "Lion";

   public Lion(String name)
   {
      super(name, animalType);
   }

   public void speak()
   {
      System.out.println("ROAR");
   }
}

//....etc for the other two animals

public class TestZoo
{
   public static void main(String[] args)
   {
      Zoo myZoo  = new Zoo();
      Lion l     = new Lion("Larry");
      Elephant e = new Elephant("Eli");
      Zebra    z = new Zebra("Zayne");

      myZoo.add(l);  //<-- note that here I don't pass Animal objects to the 
      myZoo.add(e);  //    add method but subclasses of Animal
      myZoo.add(z);
   }
}

ばかげた例でも、これが役立つことを願っています。

于 2012-04-13T03:43:22.087 に答える
2

関与している場合Object、それはどこにも役立たないジェネリック型であるため、有用なものは何も得られません。

しかし、別の状況について考えてみてください。

List<String> list = new ArrayList<String>();

listこれは、特定の何かを意味します。ArrayListそれを宣言するだけで、汎用コレクションは、コード全体で特定のメソッドListを使用しないという事実を強制します。ArrayList

これにより、特定の実装に依存しないことを効果的に示すことができます。ArrayList<String>()たとえば、LinkedList<String>()他に何も変更することなく、後で切り替えることができます。

于 2012-04-13T03:30:17.437 に答える
0

すべてのクラスは「Object」のサブクラスであるため、任意のタイプのクラスのオブジェクトから「Object」クラスのメソッドをいつでも使用できます。

代わりに、誰もがObject型のオブジェクトを作成する理由を理解する必要があります。

メソッド/機能を記述したいときに、どのタイプのオブジェクトが入力として提供されるかわからない場合は、通常、型キャストが必要です。JDKで最も一般的な例の1つは、コンパレータのequalsメソッドまたはcompareメソッドです。

// Object equals method - written for such generic use.
boolean     equals(Object obj) {
  //Here you might want to check which is other type of object.
  if (!obj instanceof CurrentClass) {
      return false;
  }
  //Additional logic required to check equality of object.
}

以前のコレクションライブラリ(JDK 1.4)でも同様のケースがありましたが、JDK1.5ではgenericと呼ばれる新機能が導入されました。

于 2012-04-13T03:43:45.803 に答える