我有这样的代码:
// This class cannot be changed
class VendorApi {
static void func1(char x) {}
static void func1(int x) {}
static void func1(float x) {}
static void func1(double x) {}
}
class Main {
static <T> void my_func(T arg) {
// much of code, which uses T
// ...
VendorApi.<T>func1(arg);
}
public static void main(String args[]) {
// call my_func for each type (char, int, float, double)
// ...
int i = 1;
my_func(i);
char c = 1;
my_func(c);
}
}
我需要做的是为来自 my_func() 的每种类型的参数调用每个函数 VendorApi.func()。发布的代码无法编译,它显示了一个想法。除了为每种类型复制粘贴 my_func() 之外,我该怎么做?
最佳答案
你可以通过 func1
作为 Consumer<T>
进入方法:
class VendorApi {
static void func1(char x) {}
static void func1(int x) {}
static void func1(float x) {}
static void func1(double x) {}
}
class Main {
static void my_func(char arg) { my_func(arg, VendorApi::func1); }
static void my_func(int arg) { my_func(arg, VendorApi::func1); }
static void my_func(float arg) { my_func(arg, VendorApi::func1); }
static void my_func(double arg) { my_func(arg, VendorApi::func1); }
private static <T> void my_func(T arg, Consumer<T> func1) {
// much of code, which uses T
// ...
func1.accept(arg);
}
public static void main(String args[]) {
// call my_func for each type (char, int, float, double)
// ...
int i = 1;
my_func(i, VendorApi::func1);
char c = 1;
my_func(c);
}
}
这为您提供编译时类型安全性(您只能从类外部调用 my_func
和 char
、int
、float
和 double
,因为通用版本是私有(private)的)并避免反射。
还有 my_func
应该是 myFunc
如果您想遵循 Java 方法命名约定。
关于Java 泛型 : actual argument T cannot be converted to int by method invocation conversion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28109193/