fun setCollection(collection:(Mutable)Collection
无论我做什么,都没有办法只用Kotlin代码来编译它。
再现情况的代码:
//JavaInterface.class
import java.util.Collection;
public interface JavaInterface {
void setCollection(Collection<String> collection);
}
//JavaBaseClass.class
import java.util.Collection;
public class JavaBaseClass {
public void setCollection(Collection collection){}
}
//JavaSubClass.class
public class JavaSubClass extends JavaBaseClass implements JavaInterface {}
//KotlinClass.kt
class KotlinClass : JavaSubClass()
Java本身就不存在这个问题。所以我猜测这可能与平台类型有关(string!
不是any?
)。
有没有一个优雅的解决方案来解决这个问题,最好不需要编写Java代码?还是应该在Kotlin编译器中解决这个问题?
我没有研究java如何/为什么在JavaSubClass中工作的细节,即它产生了什么字节码,但是从Kotlin的角度来看,如果我研究这两个方法的签名,它们会有不明确的分派。
这个:
public void setCollection(Collection collection){}
视作为一个方法,它设置泛型类型为any?的集合。有吗?是字符串的超集。
如果您的类的客户端具有以下属性:
myCollection = Array<String>()
myInstanceOfKotlinClass.setCollection(myCollection)
应该调度哪种方法?
出于这个原因,我认为这不是Kotlin编译器中的一个bug,而是对一些更宽松的java泛型类型安全的改进。显然,java对这两种方法如何以字节码编译成同一个类做出了选择,如果您知道在上述情况下将选择哪种方法进行调度,那么这是一种好的方法。但我认为,你应该能从签名单独分辨出哪一个,而不是一些内在的知识。
fun JavaSubClass.newFunctionality(){}
看看java,这个
//JavaSubClass.class
public class JavaSubClass extends JavaBaseClass implements JavaInterface {}
暗示JavaBaseClass实现接口....
它拓宽了接口的通用类型。恶毒类型的擦除臭虫迫在眉睫。我是说看看这个:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
JavaSubClass sc = new JavaSubClass();
ArrayList<Integer> myCollection = new ArrayList<>();
sc.setCollection(myCollection);
}
}
我正在将Java中的一些类转换为kotlin,当试图从接口继承时,我遇到了编译错误: 平台声明冲突:以下声明具有相同的JVM签名(getContentID()ljava/lang/string;): 我对Kotlin来说是超级新的。
我正在将Java中的一些类转换为kotlin,当试图从接口继承时,我遇到了编译错误: 平台声明冲突:以下声明具有相同的JVM签名(getContentID()ljava/lang/string;): 下面是课程: 我对Kotlin来说是超级新的。
见 映射类继承层次结构 对于这个部分。
我在下棋。我想做一个抽象的piece类,然后可以通过pawn/knight/rook/等进行扩展。假设我的piece类是这样的: 我希望Pawn具有相同的sayName功能,但我希望它具有不同的movePiece功能,因为Pawn有自己独特的移动方式。我怎么做典当,使它扩展件,并覆盖件的移动件功能?
我是 Kotlin 的新手,我有以下疑问 - 使用Java到Kotlin转换器(此链接),我将以下Java代码转换为Kotlin。 Java类: 生成的Kotlin类: 但是我不明白Java代码和生成的静态编程语言代码是如何等价的,因为类数据成员的可见性修饰符从私有(Java)变为公共(静态编程语言)。 我相信,如果可见性修饰符被保留(数据成员在静态编程语言中被声明为私有),getter和sett
特定于 Declarative 映射API。 在 1.4 版更改: 绝大多数声明性扩展现在集成到SQLAlchemy ORM中,并且可以从 sqlalchemy.orm 命名空间。请参阅上的文档 声明性映射 对于新文档。有关更改的概述,请参见 声明式现在集成到ORM中,具有新的特性 . Object Name Description AbstractConcreteBase “concrete”声