需要一些关于这个通用Java的小帮助

时间:2011-01-16 20:39:17

标签: java generics

我正在努力使这段代码尽可能通用,但我仍然坚持到最后一部分。这是我的代码被调用的地方:

List<Integer> NewList = map(OriginalList, new IFunction<Integer>(){         
      public <T extends Number> int execute(T anInt){ 
          return anInt.intValue() + 1;                  
      }     
});

然后我有方法图:

public static <T> List<Integer> map(List<T> c, IFunction<T> f) {     
    List<Integer> TempList = new ArrayList<Integer>();
    for (T o : c){         
        TempList.add(f.execute(o));
    } 
    return TempList;
} 

和接口IFunction:

public interface IFunction<T> {     
    public <T extends Number> int execute(T o); 
}

我的错误在Map()中,其中显示TempList.add(f.execute(o));我试图声明TempList是类型T和execute方法返回类型T中增加的数字。

每当我修复代码的一部分时,我似乎已经破坏了另一部分。理想情况下,所有参数都是通用的,除了我调用我的代码

之外,任何地方都没有“整数”

4 个答案:

答案 0 :(得分:1)

您需要在map()方法中约束参数:

public static <T extends Number> List<Integer> map(List<T> c, IFunction<T> f) {     
  ...

否则f.execute()会抱怨参数的类型可以是任何内容,并且它需要Number

答案 1 :(得分:0)

试试这个:

<强> IFunction.java

public interface IFunction <T extends Number> {
    T execute(T obj);
}

<强> Main.java

public class Main {

    public static void main(String[] args) {
        List<Integer> originalList = new ArrayList<Integer>();
        List<Integer> newList = map(originalList, new IFunction<Integer>(){         
            public Integer execute(Integer anInt){ 
                return anInt.intValue() + 1;                  
            }     
        });
    }

    public static <T extends Number> List<T> map(List<T> c, IFunction<T> f) {     
        List<T> tempList = new ArrayList<T>();
        for (T o : c){         
            tempList.add(f.execute(o));
        } 
        return tempList;
    } 
}

答案 2 :(得分:0)

您应该尝试不同的通用设置:

public interface IFunction<T extends Number> {
    public int execute(T o); 
}

List<Integer> NewList = map(OriginalList, new IFunction<Integer>(){         
    public int execute(Integer anInt){ 
        return anInt.intValue() + 1;                  
    }     
});

public static <T extends Number> List<Integer> map(List<? extends T> c, IFunction<T> f) {     
    List<Integer> tempList = new ArrayList<Integer>();
    for (T o : c){         
        tempList.add(f.execute(o));
    } 
    return tempList;
}

答案 3 :(得分:0)

这与我可以删除Integer(更改变量名称以开始小写)一样接近:

public class Main
{
    public static void main(String[] args)
    {
        List<Integer> originalList = new ArrayList<Integer>();
        originalList.add(1);
        originalList.add(2);
        originalList.add(3);
        originalList.add(4);

        List<Integer> newList = map(originalList, new IFunction<Integer>()
        {
            public <T extends Number> T execute(T aNumber)
            {
                Integer result = aNumber.intValue() + 1;
                return (T) result;
            }
        });
        System.out.println(newList);
    }

    public static <T extends Number> List<T> map(List<T> c, IFunction<T> f)
    {
        List<T> tempList = new ArrayList<T>();
        for (T number : c)
        {
            tempList.add(f.execute(number));
        }
        return tempList;
    }

}

public interface IFunction<T> {
    public <T extends Number> T execute(T o);
}

仍然在execute()的实现中有一个。