我想编写一个静态的通用方法 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
类期望 X
为 Integer
且 Y
为 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/