Java中的泛型映射

Java中的泛型映射,java,generics,Java,Generics,我想编写一个静态的通用方法map,它得到两个参数: 第一个参数是实现接口公共接口函数{public Y apply(X X);};第二个参数的类型为LinkedList。 该方法从Y返回元素的链接列表。结果列表的每个元素都是通过将第一个参数应用于参数列表的一个元素来计算的;顺序对应于参数列表 示例: Function <Integer, Boolean> even = new Even (); System.out.println (map (even, xs)); 对于偶数.j

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

示例:

Function <Integer, Boolean> even = new Even ();
System.out.println (map (even, xs));
对于偶数.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
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

首先,您的
偶数
类期望
X
整数
Y
布尔值
,这意味着它应该定义为:

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

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

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

在Java-8中,无需创建自己的实现即可访问

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

上述语句将执行相同的任务。

那么您的代码有什么问题?您要求人们“自己运行并测试”?从方法中删除
static
关键字。您阅读了吗?请在提问之前尝试研究一下……我认为这并不能回答问题(除非这是一个XY问题,在这种情况下,这一个更好),谢谢@Eran。我真的很感谢你的帮助。太棒了!:)
class Even implements Function<Integer,Boolean> {
    Even(){}

    @Override
    public Boolean apply(Integer integer) {
        return (integer % 2) == 0;
    }
}
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;
}
xs.stream().map(e -> e%2==0).collect(Collectors.toList());