此刻,我正在尝试构建一个能够创建随机对象的Java类。 我用Factory Pattern尝试过,抽象的Product Interface就像:
public interface ObjectFactory<T>
{
T createObject();
}
但是当我尝试实现具体的通用产品时,它不起作用。 这是我具体产品的代码:
public class GenericFactory implements ObjectFactory<T> {
@Override
public T createObject()
{
return new T();
}
}
IntelliJ说:“无法解析符号T”
答案 0 :(得分:0)
这不是通用类的有效实现。
Concrete类需要指定类型变量T是哪个对象。
代码应更像这样:
public class GenericFactory implements ObjectFactory<MyClass> {
@Override
public MyClass createObject() {
return new MyClass();
}
}
答案 1 :(得分:0)
Java使用type erasure作为泛型。因此,JVM无法在运行时知道T
实际上是哪种类型。
您可以使用反射来创建通用工厂,但这确实很丑陋。如果要在生产中使用通用工厂,请使用Spring或类似的工具。
public interface ObjectFactory<T> {
T createObject(Class<? extends T> type);
}
public class GenericFactory<T> implements ObjectFactory<T> {
public T createObject(Class<? extends T> type) {
try {
Constructor<? extends T> constructor = type.getDeclaredConstructor();
constructor.setAccessible(true);
return constructor.newInstance();
} catch (Throwable e) {
throw new InstantiationError("Can not create an object of class " + type.getName());
}
}
}
public class Main {
public static void main(String[] args) {
GenericFactory<Car> carFactory = new GenericFactory<>();
Car car = carFactory.createObject(Car.class); // works
GenericFactory<Car> bikeFactory = new GenericFactory<>();
Bike bike = bikeFactory.createObject(Bike.class); // throws exception
}
private static class Car {}
private static class Bike {
private String color;
Bike(String color) {
this.color = color;
}
}
}