Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用特定的实体类型来泛化工厂?_Java_Generics_Design Patterns_Refactoring - Fatal编程技术网

Java 如何使用特定的实体类型来泛化工厂?

Java 如何使用特定的实体类型来泛化工厂?,java,generics,design-patterns,refactoring,Java,Generics,Design Patterns,Refactoring,我如何泛化方法getBuilder,使其不依赖于对象,而是依赖于UnitBuilder或SourceBuilder的类型 public class BuilderFactory { Object getBuilder (Object entity) throws UnsupportedResourceEntityType { if (entity instanceof Source){ return new SourceBuilder();

我如何泛化方法
getBuilder
,使其不依赖于
对象
,而是依赖于
UnitBuilder
SourceBuilder
的类型

public class BuilderFactory {
    Object getBuilder (Object entity) throws UnsupportedResourceEntityType {
        if (entity instanceof Source){
            return new SourceBuilder();
        }
        if (entity instanceof Unit){
            return new UnitBuilder();
        }
        throw new UnsupportedResourceEntityType();
    }
}

被迫提供一个类的实例只是为了了解它的类,这没有什么意义。您应该将
SourceBuilder.class
UnitBuilder.class
作为参数传递,因此您的方法是(我假设您为这两个类保留一个公共超类型,并且这些类具有默认构造函数):

T getBuilder(类clazz){
返回clazz.newInstance();
}

SourceBuilder
UnitBuilder
之间有什么关系吗?那么为什么不用这种常见类型替换
对象呢?或者更好,通过这个公共类实现的接口。是的,但我要删除它们的超类(父类)。我不想将form
Object
强制转换为
UnitBuilder
SourceBuilder
。为什么要删除父类?不!除了结果类上的实例之外,我不能将任何东西传递到getBuilder方法。事实上,我也不能使用反射API。因为我正在寻找另一个解决方案。反射是我不能在代码中使用的东西。这是我导师的限制。所以没有反射:)在Java中,没有办法使它变得简单和清晰。它与Java无关,你拒绝了所有好的方法。如果您的类型没有关系,那么您的整个方法就是糟糕的设计。
<T extends SuperType> T getBuilder (Class<T> clazz) {
    return clazz.newInstance();
}