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 提供的包装器 类(例如 Integer
、Long
、Double
)。由于自动装箱,基本类型会自动转换为包装器的实例 类,反之亦然:
public static int calculateIntInBackground(final Callable<Integer> func) {
...
}
我想为自己编写一个小库。这是我想在其中提供的一些代码。
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 提供的包装器 类(例如 Integer
、Long
、Double
)。由于自动装箱,基本类型会自动转换为包装器的实例 类,反之亦然:
public static int calculateIntInBackground(final Callable<Integer> func) {
...
}