gpt4 book ai didi

java - 泛型方法是否可以从您传递给它的类型中调用方法

转载 作者:行者123 更新时间:2023-11-29 08:20:29 27 4
gpt4 key购买 nike

我有一个方法需要在很多类中使用。此方法旨在创建给定对象类型的新对象列表。此方法需要从每个类调用另一个方法(同一类方法的不同实现)。

我不想将方法复制/粘贴到每个类中并每次都更改对象类型,而是想创建一个具有通用方法的通用类,该类可以从每个类调用必要的方法。这可能吗?

这是我正在尝试做的事情:

public class Conversion<E> {
public static <E> List<E> toList(String str) {
//The string needs to be split because it contains
//the information to create multiple objects
String[] listArray = str.split(".");
List<E> list = new ArrayList<E>();
for (String s : listArray) {
//E.fromString() creates an object of the type E
//It is a static method
list.add(E.fromString(s));
}
return list;
}
}

当我尝试这个时,Eclipse 给我一个错误,提示 fromString(String) 未定义 E 类型。我想要的有可能吗?

最佳答案

最简单的修改是使用 strategy pattern .定义一个接口(interface)如

interface Parser<T> {
T fromString(String s);
}

并将签名更改为

public static <E> List<E> toList(String str, Parser<E> parser) {

然后使用parser.fromString(s),而不是E.fromString

示例用法

interface User {}

class UserParser implements Parser<User> {
@Override
public User fromString(String s) {
return new User() {};
}
}



toList("a.b.c", new UserParser());

假设:

如果有一些语言特性可以使静态方法成为接口(interface)契约的一部分,也许你可以像这样摆脱困境

interface Parsable<T> {
static T fromString(String s); // will not compile
}

public static <E extends Parseable<E>> List<E> toList(String str)

但这在 Java 中永远不会发生。不过,如果有另一种强类型语言允许它,也不会感到惊讶。

好像是一些hot discussion关于它是否应该包含在 TypeScript 中。

关于java - 泛型方法是否可以从您传递给它的类型中调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59302625/

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