java - 在不对返回类型进行类型转换的情况下调用工厂

标签 java generics casting factory builder

我是第一次尝试制作工厂..如果我没有正确使用模式,请原谅我!

所以这是我的工厂:

public class BuilderFactory { 

    public BuilderFactory(){        
    }

    public <T extends Builder> T getBuilderOf(Object clazz){
        if(clazz instanceof House){             
            return (T) new HouseBuilder();
        }
        return null;
    }
}

它将返回一个具有 Builder 接口(interface)的构建器(在本例中为 HouseBuilder)。

build 者:

public interface Builder<T> {

    T build();

}

建房者:

public class HouseBuilder implements Builder<House> {

    private String street;

    public HouseBuilder() {

    }
    @Override
    public House build() {
        return new House(street);
    }

    @Override
    public HouseBuilder<House> withStreet(String street) {
        this.street = street;
        return this;
    }

}

这是我称之为的地方:

BuilderFactory builderFactory = new BuilderFactory();

现在可以做到:

builderFactory.getBuilderOf(House.class).build();

因为 build() 是在 Builder 接口(interface)中。但如果我想这样做: builderFactory.getBuilderOf(House.class).withStreet("街道");

我隐含地需要像这样转换构建器:

 (HouseBuilder)builderFactory.getBuilderOf(House.class).withStreet("street")

否则编译器会报错。

我不想转换它,也不想从工厂实例化我的返回值。有没有我不必强制转换结果并且仍然可以使用 .withStreet() 方法的选项? :)

提前致谢。 戴维

最佳答案

为什么要为泛型烦恼?

您的工厂明确需要知 Prop 体的 builder (return (T) new HouseBuilder())。

您的客户端明确需要传递正确的类型 (House.class),显然您希望它知道该类型,因为客户端使用特定于具体构建器的方法 (withStreet).

所以只需将工厂方法具体化即可:

public HouseBuilder getHouseBuilder() {
    return new HouseBuilder();
}

关于java - 在不对返回类型进行类型转换的情况下调用工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22336205/

相关文章:

C# LINQ 筛选 IEnumerable<IX> 并表示为 IEnumerable<X :IX>

java - Spring安全无法找到登录url

java - 当 onChildAdded 事件被触发时,如何在 Firebase 中获取父项?

Php Hack中使用反射获取泛型类型

c# - 如何从 LinkedList<T> 中提取 LinkedListNode<T>

c++ - 在未调用的转换函数上在模板中编译错误

java - 调用Class类型对象的方法

java - 无法读取 JSON : Unexpected end-of-input in field name

java - 泛型类的数组

带有默认值和类型推断的 TypeScript 判别联合类型