Java-Thread 中的泛型

Generics in Java-Thread

我想为自己编写一个小库。这是我想在其中提供的一些代码。

public class ThreadUtils {    
    private static String result;   
    public static Void runInBackground(final Callable<Void> func) {    
        new Thread(new Runnable() {
            public void run() {
                try {
                    func.call();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();    
        return null;
    }  
    public static String runInBackground(final Callable<String> func) {    
        result = "";    
        new Thread(new Runnable() {
            public void run() {
                try {
                    result = func.call();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();    
        return result;
    }    
}

我很惊讶我的 IDE 说它不起作用,因为重复声明。为什么会这样,正常情况下它能识别参数不同,但它不会? 如何使 runInBackground 能够 return 不同的原始类型?

由于类型擦除,Java 中的泛型在 运行 时不可用。这意味着您有两个具有相同名称和相同参数类型的方法,因此 Java 无法选择使用哪一个。

您必须为您的方法指定不同的名称:

public static Void calculateVoidInBackground(final Callable<Void> func) {
    ...
}    
public static String calculateStringInBackground(final Callable<String> func) {
    ...
}  

回答你的第二个问题:原始类型不能用作泛型参数。但是,您可以使用 Java 提供的包装器 类(例如 IntegerLongDouble)。由于自动装箱,基本类型会自动转换为包装器的实例 类,反之亦然:

public static int calculateIntInBackground(final Callable<Integer> func) {
    ...
}