Java中的通用映射

时间:2018-02-04 09:34:14

标签: java generics

我想编写一个静态的泛型方法map,它有两个参数: 第一个参数是实现接口public interface Function<X,Y> { public Y apply(X x); }的对象;第二个参数的类型为LinkedList。 该方法返回Y中元素的链接列表。结果列表的每个元素都是通过将第一个参数应用于参数列表的元素来计算的。该顺序对应于参数列表。

示例:

Function <Integer, Boolean> even = new Even ();
System.out.println (map (even, xs));

对于列表xs = [72,9,21,174,6,93],在此示例中打印[true,false,false,true,true,false],其中类Even实现一个函数,只有偶数参数的真实回报。

到目前为止,我已经设法让它适用于特定类型(整数,布尔),但我无法将此解决方案转换为通用解决方案。

我以为我可以用X和Y替换Boolean和Integer,但这不起作用。

到目前为止我的代码:

import java.util.LinkedList;

public class Map<X,Y>{

    private X xgen;
    private Y ygen;


    private static LinkedList<Y> map(Function<X, Y> obj, LinkedList<X> xs) {
        LinkedList<Y> res = new LinkedList<>();
        for (X x:xs){ //Lambda also possible
            res.add(obj.apply(x));
        }
        return res;
    }


    public static void main(String[] args) {
        Function<Integer,Boolean> even = new Even();
        LinkedList<Integer> xs= new LinkedList<>();
        xs.add(72);
        xs.add(9);
        xs.add(21);
        xs.add(174);
        xs.add(6);
        xs.add(93);
        System.out.println(xs);
        System.out.println(map(even,xs));

    }
}

为了测试目的,我还写了Even类:

public class Even implements Function<X,Y> {

    Even(){}

    @Override
    public Y apply(X integer) {
        return (integer % 2) == 0;
    }
}

非常感谢任何想法,提示或提示。

编辑:AS @ user202729指出,我没有说明我的代码有问题:

对于Map.java

Error:(9, 47) java: non-static type variable X cannot be referenced from a static context
Error:(9, 50) java: non-static type variable Y cannot be referenced from a static context
Error:(9, 69) java: non-static type variable X cannot be referenced from a static context
Error:(9, 31) java: non-static type variable Y cannot be referenced from a static context
Error:(10, 20) java: non-static type variable Y cannot be referenced from a static context
Error:(11, 14) java: non-static type variable X cannot be referenced from a static context

对于Even.java

Error:(1, 39) java: cannot find symbol
  symbol: class X
Error:(1, 41) java: cannot find symbol
  symbol: class Y
Error:(6, 20) java: cannot find symbol
  symbol:   class X
  location: class Even
Error:(6, 12) java: cannot find symbol
  symbol:   class Y
  location: class Even

2 个答案:

答案 0 :(得分:3)

首先,您的Even课程要求XIntegerYBoolean,这意味着它应定义为:< / p>

class Even implements Function<Integer,Boolean> {
    Even(){}

    @Override
    public Boolean apply(Integer integer) {
        return (integer % 2) == 0;
    }
}

其次,如果您希望static方法使用泛型类型参数,则必须定义自己的参数:

private static <X,Y> LinkedList<Y> map(Function<X, Y> obj, LinkedList<X> xs) {
    LinkedList<Y> res = new LinkedList<>();
    for (X x:xs){ //Lambda also possible
        res.add(obj.apply(x));
    }
    return res;
}

static方法无法访问类级别的泛型类型参数。

答案 1 :(得分:0)

在Java-8中,您可以在不创建自己的实现的情况下完成此任务。

xs.stream().map(e -> e%2==0).collect(Collectors.toList());

以上陈述将执行相同的任务。