Java类/接口中的方法签名是否包含其返回类型?
例:
Java是否知道这两种方法之间的区别:
public class Foo {
public int myMethod(int param) {}
public char myMethod(int param) {}
}
Run Code Online (Sandbox Code Playgroud)
或者也许只有方法名称和参数列表才重要?
在Java中,我有可能"实现"注释.
示例Java注释:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaClassAnno {
String[] value();
}
Run Code Online (Sandbox Code Playgroud)
示例Java"实现":
class MyAnnotationLiteral
extends AnnotationLiteral<JavaClassAnno>
implements JavaClassAnno { // <--- works in Java
private String value;
public MyAnnotationLiteral(String value) {
this.value = value;
}
@Override
public String[] value() {
return new String[] { value };
}
}
Run Code Online (Sandbox Code Playgroud)
试图将其移植到Kotlin不起作用,因为它说注释是最终的,因此不能继承,即以下将不起作用:
class MyAnnotationLiteral(private val internalValue: String)
: AnnotationLiteral<JavaClassAnno>(),
JavaClassAnno { // <--- doesn't work in Kotlin (annotation can not be inherited)
override fun value(): Array<String> {
return arrayOf(internalValue)
}
}
Run Code Online (Sandbox Code Playgroud)
你如何"实施/扩展"Kotlin方式的注释?无法找到任何理由为什么Kotlin在这方面与Java有所不同.任何提示如何解决这个问题的提示或任何说明原因的方法都是受欢迎的.
以下问题包含此星座的用例: …
以下声明在Kotlin中是合法的.
fun foo(): String = "foo_1"
fun <T> foo(): T = "foo_2" as T
Run Code Online (Sandbox Code Playgroud)
作为字节码我们得到:
public final static foo()Ljava/lang/String;
// signature <T:Ljava/lang/Object;>()TT;
// declaration: T foo<T>()
public final static foo()Ljava/lang/Object;
Run Code Online (Sandbox Code Playgroud)
也可以从Kotlin调用这两种方法.
当我试图从Java中调用其中任何一个时,问题出现了:
ClassKt.foo()
Run Code Online (Sandbox Code Playgroud)
暧昧的电话.两种方法都匹配......
如何避免这样的问题?如何处理这样的方法?如果第三方kt库有同样的问题怎么办?
上面的例子是合成的例子.