这里不允许'void'类型,Callable func

时间:2014-09-08 19:04:22

标签: java sorting higher-order-functions callable

我试图通过Callable将函数作为函数的参数。当您尝试运行它时,它会说错误' void'这里不允许输入 long a = timer(sort.Insertion(A));

为什么?

import java.util.*;
import java.util.concurrent.*;
import java.io.*;

public class ThisClass {
    public static Sort sort = new Sort();

    public static void main(String[] args) throws FileNotFoundException {

        Scanner scanner = new Scanner(new File("location/here.txt"));

        int z = 0;

        while(scanner.hasNextInt()) {
            z++;
        }

        int[] A = new int[z];
        for(int i = 0; i < A.length; i++) {
            A[i] = scanner.nextInt();
            System.out.print(" " + A[i]);
    }

        long a = timer(sort.Insertion(A));
    }

    public long timer (Callable func) throws Exception {
        long start = System.currentTimeMillis();
        func.call();
        long end = System.currentTimeMillis();
        return end - start;
    }

    public static void print (int[] A) {
        for(int i = 0; i < A.length; i++) {
            System.out.print(" " + A[i]);
        } 
    }

}

import java.util.ArrayList;

public class Sort {

    public void Insertion (int[] A) {
        for(int j = 1; j < A.length; j++) {
            int key = A[j];
            int i = j - 1;
            while((i >= 0) && (A[i] > key)) {
                A[i + 1] = A[i];
                i = i - 1;  
            }
            A[i + 1] = key;
        }
    }
}

PS。如果有人可以帮助其他方法在Java中使用高阶有序函数,或者将函数作为函数中的参数传递,那就太好了。非常感谢。

1 个答案:

答案 0 :(得分:1)

错误消息是Sort.Insertion()void返回类型。

如果您尝试在计时器上调用它,则需要将其包装在Callable中,如此(未经测试):

    long a = timer(new Callable<Void>() {
        Void call() {
           sort.Insertion(A);
           return null;
        }
    });

这需要A final。根据需要更改Void