gpt4 book ai didi

java - 如何为泛型类型创建工厂?

转载 作者:行者123 更新时间:2023-11-30 08:02:56 27 4
gpt4 key购买 nike

我需要创建一个可以返回具有特定参数化类型的对象的单个 Factory 对象。也就是说,我需要在工厂方法中指定对象的参数化类型。一个例子是我能想到的最好的解释方式,所以请考虑以下类定义。

interface Color {
int getColor();
}

abstract class Animal<T extends Color> {
T color;
Animal(T col) { color = col; }
public T getColor() { return color; }
}

class Dog<T extends Color> extends Animal<T> {
public Dog(T col) {
super(col);
}
public void woof() {
System.out.println("Woof");
}
}

class Cat<T extends Color> extends Animal<T> {
public Cat(T col) {
super(col);
}
public void meow() {
System.out.println("Meow");
}
}

class Blue implements Color {
public int getColor() {
return 1;
}
public void iAmBlue() {
System.out.println("I am blue.");
}
}

class Red implements Color {
public int getColor() {
return 2;
}
}

// Expecting a base Factory interface that's something like this?
public interface Factory<K extends Animal<? extends Color>> {
public <T extends Color> K create(T color);
}

public class CatFactory implements Factory<Cat<? extends Color>> {
@Override // I want this to return Cat<T>, not Cat<?>
public <T extends Color> Cat<? extends Color> create(T color) {
return new Cat<T>(color);
}
}

我基本上需要创建一个可以创建任何 Dog ( Dog<Red>Dog<Blue> )的单个 Factory 对象,以及一个可以创建任何 Cat ( Cat<Red>Cat<Blue> )的单独对象。构造对象时,我需要它能够返回 Dog<Red>Dog<Blue> ,不是Animal<?>Dog<?> 。因此,类似这样的东西应该是有效的(不需要类型转换):

dogFactory.create(new Red()).woof();
dogFactory.create(new Blue()).getColor().iAmBlue();

最佳答案

dogFactory.create(new Blue()).getColor().iAmBlue() 中,我得出的结论是,您需要在工厂的某个位置保存类型 颜色。由于 create() 方法是当前唯一保存它的方法,因此您需要在类级别提取它的类型参数。像这样的东西:

public interface Factory<T extends Color, K extends Animal<T>> {
public K create();
}

这需要将工厂实现更改为:

public class CatFactory<T extends Color> implements Factory<T, Cat<T>> {

private T color;

public CatFactory(T color) {
this.color = color;
}

@Override
public Cat<T> create() {
return new Cat<T>(color);
}

public T getColor() {
return color;
}

}

现在,您可以通过像这样实例化工厂来执行示例中所需的操作:

public static void main(String[] args) {
CatFactory<Blue> blueCatsFactory = new CatFactory<Blue>(new Blue());
blueCatsFactory.create().meow();
blueCatsFactory.create().getColor().iAmBlue();
}

关于java - 如何为泛型类型创建工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31612385/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com