java - Java 线程中的泛型

标签 java multithreading generics primitive

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

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 能够返回不同的原始类型?

最佳答案

由于类型删除,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) {
    ...
}  

关于java - Java 线程中的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33649378/

相关文章:

java - 如何检测字符串中的最后一个字符是否不是字母?

vb.net - 一旦条件为真就返回而不挂起

Java 多态泛型调用

java - 区别对待?在扩展和 super

java - 设计模式名称: Is it a factory?

java - java.lang.RuntimeException:java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

java - I/O 线程的直接切换还是阻塞队列?

python - 当子类化 threading.Thread 时,我是否必须调用 super.join() ?

scala - 具有相同名称的两个类型参数

C 通用打印数组函数 - 打印字符串数组