このシナリオでは、スーパークラスで静的メソッドを呼び出した場合、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();