gpt4 book ai didi

java - Java 的通用 `any` 函数

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

我有各种NodeToken 和其他类。每个类都有自己的 Type 枚举。

我有节点列表、 token 列表和其他列表。

而且我经常想查看列表中是否有任何特定 Type 的项目。

例如,要查看标记列表中是否有任何关键字,我会遍历它们:

Token found = null;
for(Token token: statement)
if(token.type == Token.Type.KEYWORD &&
(token.token.equals("static") ||
(token.token.equals("final")) {
found = token;
break;
}
if(found != null) {
....

如果我写小 helper ,我可以整理我的代码很多(因为我很想弄清楚列表中的内容):

Token any(Collection<Token> haystack,Token.Type type,String... needles) {
for(Token straw: haystack)
if(straw.type == type)
for(String needle: needles)
if(needle.equals(straw.token))
return straw;
return null;
}

然后,在其他地方,我可以:

if((found = any(statement,Token.Type.KEYWORD,"static","final")) != null)
...

有什么方法可以将此推广到 Node 和其他变量,以及非字符串比较和字段不同且命名不同的地方?

使用 C++ 模板,您可以躲避类型;对于 Java,我正在努力寻找如何做到这一点,尽管让类与它们自己的类型相比较等等可能是一种前进的方式?

最佳答案

你会使用鸭子类型的事情通常可以用 java 中的接口(interface)来完成。考虑这个界面:

public interface Typed<T extends Enum<T>> {
T getType();
String getToken();
}

然后您可以更改您的any 方法以仅使用实现此接口(interface)的类型:

public <A extends Enum<A>, B extends Typed<A>> B any(Collection<B> haystack, A type, String... needles) {
for (B straw : haystack)
if (straw.getType().equals(type))
for (String needle : needles)
if (needle.equals(straw.getToken()))
return straw;
return null;
}

关于java - Java 的通用 `any` 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689880/

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