AspectJ类型层次结构中的kotlin委托编译器问题
注意
TLDR; 我发现这只是一个环境问题。 带有kotlin代码的JAR具有旧的类文件,导致编译器100%正确处理的意外问题。
我认为JAR中还有另外一个类文件,我试图依赖这个叫做SimpleLink
的类,而不是一个接口。 当我删除.kt
文件时,Gradle Kotlin编译插件没有删除这些类。 LPT:在尝试发布之前运行Gradle clean任务,即使您只发布到maven本地。
我有一个与使用另一个项目的kotlin类的代码连接的aspectj问题。
aspectJ编译器运行1.8.6
版本。
我特别的问题是,我一直看到这样的: Type mismatch: cannot convert from element type ExtendedSimpleLink to SimpleLink
我有一个类型层次结构,其中ExtendedSimpleLink extends LinkDecorator
,其中ExtendedSimpleLink extends LinkDecorator
在LinkDecorator
中编写并在另一个项目中编译, ExtendedSimpleLink
是使用aspectj编译器编译的java。
LinkDecorator
看起来像这样:
abstract class LinkDecorator( private val decorated : SimpleLink ) : SimpleLink by decorated { override fun hashCode(): Int = decorated.hashCode() override fun equals(other: Any?): Boolean = decorated == other }
我不知道为什么aspectj编译器不能找出类型层次结构。 它应该查看LinkDecorator
的字节码,并说显然ExtendedSimpleLink
是一个SimpleLink
的实例。
作为例子,下面的代码(试图由aspectJ编译器编译):
final class ExtendedSimpleLink extends LinkDecorator { private final Double something; private final Object somethingElse; private ExtendedSimpleLink( final SimpleLink decorated, final Object somethingElse, final Double something) { super(decorated); this.somethingElse = somethingElse; this.something = something; } public static ExtendedSimpleLink from(final SimpleLink decorated) { if (decorated instanceof ExtendedSimpleLink) { return (ExtendedSimpleLink) decorated; } return new ExtendedSimpleLink(decorated, null, null); } }
编译上面的类从maven提供这个错误:
[ERROR] /Users/[user]/work/tmp/[project]/Core/src/main/java/com/company/core/engine/fitting/ExtendedSimpleLink.java:50:0::0 The return type is incompatible with LinkDecorator.getFabricLinkMetricEnhancement() [ERROR] error at if (decorated instanceof ExtendedSimpleLink) [ERROR] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [ERROR] /Users/[user]/work/tmp/[project]/Core/src/main/java/com/company/core/engine/fitting/ExtendedSimpleLink.java:58:0::0 Incompatible conditional operand types SimpleLink and ExtendedSimpleLink [ERROR] error at return (ExtendedSimpleLink) decorated; [ERROR] ^^^^^^^^^^^^^^^^^
这个代码IntelliJ似乎完全正常。 然而,我认为它使用JavaC编译器进行linting。
我的问题是,为什么会发生这种情况? 在AspectJ编译器中是否有已知的问题? 与groovy和aspectJ编译器interop有类似的问题,例如?
更新
我已经尝试添加以下内容来查看是否可以解决问题:
final class ExtendedSimpleLink extends LinkDecorator implements SimpleLink { // same as above... }
现在我有和以前一样的例外情况,但添加了一个新的例外:
[ERROR] error at final class ExtendedSimpleLink extends LinkDecorator implements SimpleLink [ERROR] ^^^^^^^^^ [ERROR] /Users/[user]/work/tmp/[project]/Core/src/main/java/com/company/core/engine/fitting/ExtendedSimpleLink.java:23:0::0 The type SimpleLink cannot be a superinterface of ExtendedSimpleLink; a superinterface must be an interface