java - Java 中的通用映射

标签 java generics

我想编写一个静态的通用方法 map ,它有两个参数: 第一个参数是一个实现接口(interface) 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 实现了一个函数,该函数对于偶数参数,仅返回 true。


到目前为止,我已经设法让它适用于特定类型(整数、 boolean 值),但我很难将此解决方案转变为通用解决方案。

我以为我可以用 X 和 Y 替换 boolean 值和整数,但这不起作用。

到目前为止我的代码:

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;
    }
}

任何想法、技巧或暗示都将不胜感激。



编辑:正如@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

最佳答案

首先,您的 Even 类期望 XIntegerY boolean 型,这意味着它应该定义为:

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;
}

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

关于java - Java 中的通用映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48606669/

相关文章:

Java:单元测试图像操作

java - 1 个内部框架的虚拟鼠标

java - 如何自定义 Spring Boot 隐式使用的 Jackson JSON 映射器?

Java Wicket (6.19) IVisitor 参数传递

java - Java中 "final class"有什么意义?

java - 在 Java 中从相机接收图像时出现伪影

java - 泛型类中的 hibernate 继承

java - 点运算符 `.`(在通用参数之前)是什么意思?

c# - 在 C# 3.5 中向下转换泛型类型

C# - 具有 new() 约束的泛型如何生成机器码?