我尝试构建一个 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
1条答案
按热度按时间dauxcl2d1#
泛型参数仅在Java源代码中。
Java编译器在编译时确保类型安全,然后丢弃元素类型信息,这称为type erasure。
这是标准行为,您的 Delphi 代码可能只使用使用普通(非泛型)类型的Java代码。