Java 泛型 : actual argument T cannot be converted to int by method invocation conversion

标签 java generics

我有这样的代码:

// 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_funccharintfloatdouble,因为通用版本是私有(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/

相关文章:

java - 使用接口(interface) Class<T> 作为键来获取具体的实例值?

java - 为什么 `Class<T> == Boolean.class` 会在 `T extends Comparable<? super T>` 时导致编译器错误?

java - 通用 Autowiring 不适用于@Transactional

java - 在java中使用嵌套泛型时出现奇怪的结果

ios - Swift 泛型和协议(protocol) : Return specialized type from static function?

java - andengine 使用 SurfaceScrollDetector、PinchZoomDetector 平滑滚动和缩放

java - 使用 println 无法获得正确的输出格式

java - 什么是先到的 - finally 还是 catch block ?

java - 为什么在 Java 中存储为 float 和 double 的相同值之间存在差异?

java - Google Apps 类到 JList