作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要创建一个可以返回具有特定参数化类型的对象的单个 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/
我是一名优秀的程序员,十分优秀!