gpt4 book ai didi

java - 如何为静态工厂方法定义泛型父类(super class)型?

转载 作者:行者123 更新时间:2023-11-30 06:37:48 31 4
gpt4 key购买 nike

如果已经有人问过这个问题,请链接并关闭这个问题。


我目前正在为另一个使用起来复杂得多(并且有潜在危险)的 API 的简化 API 设计原型(prototype)。

考虑到相关的有点复杂的对象创建,我决定使用静态工厂方法来简化 API,目前我有以下方法可以按预期工作:

public class Glue<T> {

private List<Type<T>> types;

private Glue() { types = new ArrayList<Type<T>>(); }
private static class Type<T> {
private T value;
/* some other properties, omitted for simplicity */
public Type(T value) { this.value = value; }
}

public static <T> Glue<T> glueFactory(String name, T first, T second) {
Glue<T> g = new Glue<T>();
Type<T> firstType = new Glue.Type<T>(first);
Type<T> secondType = new Glue.Type<T>(second);

g.types.add(firstType);
g.types.add(secondType);
/* omitted complex stuff */
return g;
}
}

如前所述,这按预期工作。当 API 用户(=另一个开发人员)键入 Glue<Horse> strongGlue = Glue.glueFactory("2HP", new Horse(), new Horse()); 时他得到了他想要的。

我缺少的是如何执行 Horse - 或者任何放入工厂方法的东西 - 总是 实现 SerializableComparable ?使用 <T extends Comparable<T> & Serializable> 简单地将它们添加到工厂方法的签名中不一定在所有情况下都强制执行此规则,仅当使用此简化的 API 时。这就是为什么我想将它们添加到类的定义中,然后相应地修改工厂方法。

PS:在写这个问题时没有马(当然也没有小马!)受到伤害。

最佳答案

你实际上非常接近。这是我的解决方案

public class Glue<T extends Serializable & Comparable<T>> {

private List<Type<T>> types;

private Glue() { types = new ArrayList<Type<T>>(); }
private static class Type<T> {
private T value;
/* some other properties, omitted for simplicity */
public Type(T value) { this.value = value; }
}

public static <V extends Serializable & Comparable<V>> Glue<V> glueFactory(
String name, V first, V second) {
Glue<V> g = new Glue<V>();
Type<V> firstType = new Glue.Type<V>(first);
Type<V> secondType = new Glue.Type<V>(second);

g.types.add(firstType);
g.types.add(secondType);
/* omitted complex stuff */
return g;
}
}

public class Horse implements Serializable, Comparable<Horse> {
private static final long serialVersionUID = 1156763996034008367L;

@Override
public int compareTo(Horse o) {
return 0;
}
}

public class Cat { }

public static void main(String[] args) {
Glue<Horse> gh = Glue.glueFactory("2HP", new Horse(), new Horse());
Glue<Cat> gc = Glue.glueFactory("2C", new Cat(), new Cat()); // <--- Does not compile, as requested!!
}

此程序在这些方面与您的代码不同:

  • 我将类型参数 T(glueFactory() 方法)重命名为 V。鉴于该方法是静态的,其类型参数与包含的类类型参数无关,因此当两者具有不同名称时,代码会更加清晰。
  • 我在 VT 的声明中添加了边界(implements Serializable & Comparable ...)

正如预期的那样,生成的程序编译 Glue.glueFactory("2HP", new Horse(), new Horse()); 但拒绝 Glue.glueFactory("2C", new Cat (), 新猫());

关于java - 如何为静态工厂方法定义泛型父类(super class)型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3036349/

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