gpt4 book ai didi

java - 无法从 Guava 解析通用参数 TypeToken

转载 作者:行者123 更新时间:2023-12-01 18:22:36 26 4
gpt4 key购买 nike

我正在开发一个框架,用于为 Selenium 测试框架构建通用菜单,并且我一直在使用 Guava TypeToken 来解析通用参数的类型,但现在我遇到了一个问题,类型 token 没有解析参数:

我有一个abstract基地class对于生成菜单选项的构建器:

public abstract class AbstractMenuOptionBuilder<O extends IClickable>  {

protected final TypeToken<AbstractMenuOptionBuilder<O>> typeToken = new
TypeToken<AbstractMenuOptionBuilder<O>>(getClass()) { };

public abstract O create();
}

这是一个具体的class对于 build 者:

public class MenuOptionBuilder<O extends IClickable> extends AbstractMenuOptionBuilder<O> {

public O create() {
TypeToken<?> genericOptionParam = typeToken.resolveType(AbstractMenuOptionBuilder.class.getTypeParameters()[0]);

Class<O> optionClass;

try {

optionClass = (Class<O>) Class.forName(genericOptionParam.getType().getTypeName());

<.... snip ....>

} catch(ClassNotFoundException e) {
log.catching(e);
return null;
}
}
}

我有一个abstract基地class对于具有返回菜单选项列表的方法的菜单:

public abstract class AbstractMenu<O extends IClickable> {

public final List<O> getOptions() {

//This is where my plan doesn't work. The runtime type is given by
//a concrete menu class which extends AbstractMenu, but that runtime
//type doesn't seem to pass through to the abstract base class for the builder.
MenuOptionBuilder<O> builder = new MenuOptionBuilder<O>(new MenuOptionBean()){};

<.... snip ....>
}

}

我有一个具体的菜单 classextends它:

   //The runtime type of 'Link' is not known by the type token that is supposed to
//resolve it in the abstract builder base class.
public SimpleMenu extends AbstractMenu<Link> {
<.... snip ....>
}

我预计变量 genericOptionParamMenuOptionBuilder将解析为 Link ,但它没有相反,它解析为 O ,泛型类型参数的名称,而不是其运行时类型 Link 。如果我创建一个额外的基地 class像这样,通用参数可以正确解析:

public abstract class AbstractSimpleLinkedMenu extends AbstractMenu<Link> {

public final List<Link> getOptions() {

MenuOptionBuilder<Link> builder = new MenuOptionBuilder<Link>(new MenuOptionBean()){};
<.... snip ....>
}
}

我不想添加额外的基类,例如 AbstractSimpleLinkedMenu ,那么我在这里错过了什么或做错了什么吗?我认为抽象构建器的匿名内部类会知道运行时类型,但如果使用泛型参数声明构建器则不会。运行时类型由具体菜单class指定。 , SimpleMenu ,但它似乎没有过滤到 abstract菜单选项的构建器类。

最佳答案

这就是TypeToken“hack”的工作原理。它使用 Class#getGenericSuperclass() (或getGenericSuperInterface)。它的 javadoc 指出

If the superclass is a parameterized type, the Type object returned must accurately reflect the actual type parameters used in the source code.

在本例中,即O,此处

public abstract class AbstractMenuOptionBuilder<O extends IClickable>

您可以获得源代码中硬编码的内容。如果您将 Link 硬编码为类型参数,就像您在此处所做的那样

MenuOptionBuilder<Link> builder = 
new MenuOptionBuilder<Link>(new MenuOptionBean()) {};

然后您将获得链接

在这种情况下

MenuOptionBuilder<O> builder = 
new MenuOptionBuilder<O>(new MenuOptionBean()){};

你已经硬编码了O,所以这就是你将得到的。

以下是我就类型标记主题撰写的更多内容:

关于java - 无法从 Guava 解析通用参数 TypeToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27234928/

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