gpt4 book ai didi

java - 将泛型返回类型转换为接口(interface)类型

转载 作者:行者123 更新时间:2023-12-01 23:30:26 25 4
gpt4 key购买 nike

我正在尝试为通用包装器创建一个工厂方法,但遇到的问题是我要么需要传递所需的返回类型(wrapTyped()-方法),要么必须将输入参数显式转换为所需的返回类型返回类型(wrapAuto() 方法,第一次使用)。但我并且不想写额外的 Actor :)

有什么方法可以表达wrapAuto()的声明,以便case“wantThis”(在最底部)起作用吗?

public class GenericFactory {

static class Wrapper<T> {
T wrappdObject;
boolean flag;
String name;

public Wrapper(T wrappedObject, boolean flag, String name) {
this.wrappdObject = wrappedObject;
this.flag = flag;
this.name = name;
}

public T getObject() {
return wrappdObject;
}

// some more irrelevant methods
}

static interface InterfaceType {
}

static class ImplementationA implements InterfaceType {
}

static <U> Wrapper<U> wrapTyped(Class<U> type, U wrappedObject, boolean flag, String name) {
return new Wrapper<U>(wrappedObject, flag, name);
}

static <U> Wrapper<U> wrapAuto(U wrappedObject, boolean flag, String name) {
return new Wrapper<U>(wrappedObject, flag, "NoName");
}

// compiles, but is cumbersome
public Wrapper<InterfaceType> cumbersome = wrapTyped(InterfaceType.class, new ImplementationA(), true, "A");

// compiles, but is also cumbersome
public Wrapper<InterfaceType> alsoUgly = wrapAuto((InterfaceType) new ImplementationA(), true, "B");

// Want this, but "Type mismatch error"
public Wrapper<InterfaceType> wantThis = wrapAuto(new ImplementationA(), false, "C");

}

我将其精简了一点,为了简单起见,我只声明了一组接口(interface)和具体实现。我练习的类Wrapper可能会用于许多完全不同、不相关的类型。

最佳答案

在方法 wrapAuto 中,添加另一个类型参数,以 U 为上限,并将其用作形式参数类型:

static <U, T extends U> Wrapper<U> wrapAuto(T wrappedObject, boolean flag, String name) {
return new Wrapper<U>(wrappedObject, flag, "NoName");
}

然后这就会起作用:

Wrapper<InterfaceType> wantThis = wrapAuto(new ImplementationA(), false, "C");

通过此调用,T 被推断为 ImplementationAU 被推断为 InterfaceType。并且边界 T extends U 与这些类型完美匹配。

<小时/>

引用文献:

关于java - 将泛型返回类型转换为接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19409515/

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