delphi 具有泛型参数的Java2OP接口

qij5mzcb  于 2022-11-23  发布在  Java
关注(0)|答案(1)|浏览(215)

我尝试构建一个 Delphi 桥文件来访问用Kotlin编写的Android库。

public interface Function<R> {}

public interface Function2<P1, P2, R> extends Function<R> {
    R invoke(P1 var1, P2 var2);
}

public final class Unit {
    // snip
}

public interface Controller {
    void getNearbyStops(@NotNull Function2<? super List<Stop>, ? super Error, Unit> var1);
}

使用Java 2 OP可以得到的最佳结果是下面的 Delphi 声明:

Jkotlin_FunctionClass = interface(IJavaClass)
    ['{8F273534-5758-45AB-BC0F-2851C32D3350}']
  end;

  [JavaSignature('kotlin/Function')]
  Jkotlin_Function = interface(IJavaInstance)
    ['{8DFE502E-1AD9-4AD1-8940-BE903549AFC9}']
  end;
  TJkotlin_Function = class(TJavaGenericImport<Jkotlin_FunctionClass, Jkotlin_Function>) end;

  JFunction2Class = interface(Jkotlin_FunctionClass)
    ['{630CDE10-8184-4A7C-9F6C-0F084112415D}']
  end;

  [JavaSignature('kotlin/jvm/functions/Function2')]
  JFunction2 = interface(Jkotlin_Function)
    ['{8090FA02-E298-4606-8035-17A4FB3A4456}']
    //function invoke(p1: J; p2: J): JObject; cdecl;
  end;
  TJFunction2 = class(TJavaGenericImport<JFunction2Class, JFunction2>) end;

  JControllerClass = interface(IJavaClass)
    ['{66D15F2C-39DE-40EE-99F3-3A10A45A93D3}']
  end;

  [JavaSignature('net/company/bla/Controller')]
  JController = interface(IJavaInstance)
    ['{20455085-2AD1-43F1-B9CD-455E8FB7EAD9}']
    procedure getNearbyStops(function2: JFunction2); cdecl;
  end;
  TJController = class(TJavaGenericImport<JControllerClass, JController>) end;

  TRegTypes.RegisterType('Android.JNI.MyBridge.Jkotlin_Function', TypeInfo(Android.JNI.MyBridge.Jkotlin_Function));
  TRegTypes.RegisterType('Android.JNI.MyBridge.JFunction2', TypeInfo(Android.JNI.MyBridge.JFunction2));
  TRegTypes.RegisterType('Android.JNI.MyBridge.JController', TypeInfo(Android.JNI.MyBridge.JController));

您可以看到它生成了Function2,但是没有它的泛型参数。因此,invoke方法被注解掉了。
是否可以修改 Delphi 代码以支持通用参数?
谢谢你的帮助!Dominik

dauxcl2d

dauxcl2d1#

泛型参数仅在Java源代码中。
Java编译器在编译时确保类型安全,然后丢弃元素类型信息,这称为type erasure
这是标准行为,您的 Delphi 代码可能只使用使用普通(非泛型)类型的Java代码。

相关问题