gpt4 book ai didi

java - 混合泛型类型变量以在 Java 中实现类型安全的映射函数

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:14 24 4
gpt4 key购买 nike

我想用 Java 编写一个类型安全的 map 方法,它返回一个与传递的参数类型相同的集合(即 ArrayList、LinkedList、TreeSet 等),但具有不同的泛型类型(尖括号之间的类型),由另一个参数的泛型类型(泛型映射函数的结果类型)决定。

所以代码将用作:

public interface TransformFunctor<S, R> {
public R apply(S sourceObject);
}

TransformFunctor i2s = new TransformFunctor<Integer, String>() {
String apply(Integer i) {return i.toString();};

ArrayList<Integer> ali = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));
ArrayList<String> als = map(ali, i2s);

TreeSet<Integer> tsi = new TreeSet<Integer>(Arrays.asList(1, 2, 3, 4));
TreeSet<String> tss = map(tsi, i2s);

这个想法是这样的:

public static <C extends Collection<?>, S, R>
C<R> map(final C<S> collection, final TransformFunctor<S, R> f)
throws Exception {
//if this casting can be removed, the better
C<R> result = (C<R>) collection.getClass().newInstance();
for (S i : collection) {
result.add(f.apply(i));
}
return result;
}

但这行不通,因为编译器不期望泛型类型变量被进一步特化(我认为)。

关于如何使这项工作有任何想法吗?

最佳答案

据我所知,在 Java 中没有办法做到这一点,因此它 (a) 编译类型安全和 (b) map 的调用者不需要重复源的集合类型和目标。 Java 不支持 higher-order kinds ,您所要求的可以在 Scala 2.8 中实现,但即使在那里实现细节也有些复杂,请参见 this SO question .

关于java - 混合泛型类型变量以在 Java 中实现类型安全的映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3352955/

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