作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想用 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/
我是一名优秀的程序员,十分优秀!