0

私はインターフェース「Vehicle」とそのインターフェースCar、Bicycle、Bikeなどを実装するクラスを持っています。

インターフェイスのVectorを作成し、実装クラスのインスタンスを割り当てることはできますか?例:

Vector<Vehicle> vi;
vi.add(0, new Car());
vi.add(1, new Bicycle());

それで、実行時に、インデックスをチェックして必要な関数を呼び出すことができますか?

4

2 に答える 2

3

できますよ。これは、実行時のポリモーフィズムの使用法の典型的な例です。

import java.util.Vector;

interface Vehicle {
    public int getNumberOfWheels();
}

class Car implements Vehicle {

    final int numberOfWheels = 4;

    public int getNumberOfWheels() {
        return numberOfWheels;
    }
}

class Bicycle implements Vehicle {

    final int numberOfWheels = 2;

    public int getNumberOfWheels() {
        return numberOfWheels;
    }
}

public class Program {

    public static void main(String args[]) {
        Vector<Vehicle> vi = new Vector<Vehicle>();
        vi.add(0, new Car());
        vi.add(1, new Bicycle());
        for(Vehicle v: vi) {
            System.out.println(v.getClass().getName() 
                + " has " + v.getNumberOfWheels() + " wheels");
        }
    }
}

デモ

于 2012-10-04T00:30:05.023 に答える
1

はい、できます。インターフェイスはそのように使用することを目的としています。

さて、それを行うためのより良い方法を提案するために:あなたが正確に何をする必要があるかがあまり明確ではないので、それを行うのは非常に困難です。最初の提案は、Vectorの代わりにArrayListを使用することです。2つの主な違いは、Vectorが「同期」されていることです。これは、スレッドセーフを意味します。ただし、同期はパフォーマンスに大きな影響を与え、Vectorクラスは、そのすべてのメソッドへのアクセスを同期することにより、完全なスレッドセーフを実現します。一般に、同期されていないコンテナを使用し、スレッドセーフが必要な場合は、使用状況に応じて必要な場所にのみ配置できるため、コンテナの外部で独自の同期を管理することをお勧めします。

リストのサイズが事前にわかっている極端な場合は、単純な配列を使用することもできます。

Vehicle[] vi = new Vehicle[2];
vi[0] = new Car();
vi[1] = new Bicycle();
于 2012-10-04T00:43:35.930 に答える