1

オブジェクト指向の文献で非常に一般的な次のシナリオを考えてみましょう。

public class Vehicle {
}

public class Car extends Vehicle {
}

public class Bike extends Vehicle {
}

get()ここで、サブクラスのインスタンスを取得できるように、常にサブクラスの型を返す関数を作成したいとします。

public static void main(String[] args) {

    Car car = Car.get();
    Bike bike = Bike.get();
    car.Start();
    bike.Start();
}

パラメータとしてpublic static <T> T get()渡したり、Object?

アップデート:

最初のバージョンでは、抽象クラスについて話していました。今、抽象を削除し、通常のクラスを使用しています。

4

2 に答える 2

1

このシナリオでは、スーパークラスで静的メソッドを呼び出した場合、Java はどのタイプのサブクラスを返すかを認識していません。パラメータを渡さずにやりたいとおっしゃいましたが、できません。パラメータを渡すことができる場合は、次のようにします。

package com.stackexchange.stackoverflow;

public class Question19281170 {
  public static void main(String[] args) throws InstantiationException, IllegalAccessException {
    Car car = Vehicle.get(Car.class);
    Bike bike = Bike.get(Bike.class);
    car.start();
    bike.start();
  }

  static abstract class Vehicle {
    public void start() {
      System.out.println(String.format("Start %s", toString()));
    }
    public static <T extends Vehicle> T get(Class<T> clazz) throws IllegalAccessException, InstantiationException {
      return clazz.newInstance();
    }
    @Override
    public String toString() {
      return "Vehicle";
    }
  }

  static class Car extends Vehicle {
    @Override
    public String toString() {
      return "Car";
    }
  }

  static class Bike extends Vehicle {
    @Override
    public String toString() {
      return "Bike";
    }
  }
}

これに対するベスト プラクティスは、ポリモーフィズムを使用することです。

Vehicle car = new Car();
Vehicle bike = new Bike();
于 2013-10-09T19:58:23.437 に答える