按照JPA的要求,@ @Entity类应该有一个默认的(非arg)构造函数来从数据库中检索对象时实例化对象。 在Kotlin中,属性在主构造函数中声明非常方便,如下例所示: class Person(val name: String, val age: Int) { /* … */ } 但是,当非参数构造函数被声明为次要构造函数时,它需要传递主构造函数的值,所以需要一些有效的值,如下所示: @Entity class Person(val name: String, val age: Int) { private constructor(): this("", 0) } 如果这些属性比String和Int有更复杂的types,并且它们是不可空的,那么为它们提供值看起来完全不好,尤其是当主构造函数和init块中有很多代码,并且参数是积极使用 – 当它们被重新分配时,大部分代码将被重新执行。 而且, val -properties不能在构造函数执行后重新分配,所以不可变性也会丢失。 所以问题是:Kotlin代码如何适应与JPA无代码重复,select“魔术”的初始值和不可变性的损失? PS除了JPA,Hibernate是否可以构造没有默认构造函数的对象呢?
如何在Kotlin中声明次级构造函数? 有没有关于这个的文件? 以下不编译… class C(a : Int) { // Secondary constructor this(s : String) : this(s.length) { … } }
你如何在Kotlin中定义一个静态的扩展方法? 这甚至有可能吗? 我目前有一个扩展方法如下所示。 public fun Uber.doMagic(context: Context) { // … } 上面的扩展可以在一个实例上调用。 uberInstance.doMagic(context) // Instance method 但是我如何使它静态方法如下所示。 Uber.doMagic(context) // Static or class method
Kotlin挑战已经开始。 所有的任务是编写控制台程序,从控制台读取参数,并将输出写入控制台,使自动检查成为可能。 在Kotlin中的主要方法看起来像 fun main(args: Array<String>): Unit { //do something } 任务中的大部分input参数应该被解释为数字。 所以,由于缺乏像Long.valueOf(String s)这样的方法,我只是卡住了。 我不能把String转换成Long,我感到羞愧。
Kotlin有一个很好的function叫做string模板。 我很喜欢。 val i = 10 val s = "i = $i" // evaluates to "i = 10" 但有可能在模板中有任何格式? 例如,我想在kotlin的string模板中格式化Double,至less要在小数点分隔符之后设置一些数字: val pi = 3.14159265358979323 val s = "pi = $pi??" // How to make it "pi = 3.14"?
var和val在Kotlin之间有什么区别? 我已经通过这个链接: https://kotlinlang.org/docs/reference/properties.html 正如这个链接所述: 只读属性声明的完整语法在两种方式上不同于可变属性声明:它以val而不是var开头,不允许使用setter。 但之前有一个使用setter的例子。 fun copyAddress(address: Address): Address { val result = Address() // there's no 'new' keyword in Kotlin result.name = address.name // accessors are called result.street = address.street // … return result } var和val什么区别? 为什么我们需要两个? 这不是 Kotlin中variables 的重复 ,与Java的区别。 var vs val? 因为我正在质疑与文件中的特定示例有关的疑问,而不仅仅是一般。
在Java中,可以初始化一个数组,例如: int numbers[] = new int[] {10, 20, 30, 40, 50} Kotlin的数组初始化是怎样的?
试图用Android Studio 3.0 Canary 1启动一个新的Kotlin项目显示这个错误。 全迹: 错误:无法find方法'com.android.build.gradle.internal.variant.BaseVariantData.getOutputs()Ljava / util / List;'。 这种意外错误的可能原因包括: Gradle的依赖关系caching可能已损坏(有时发生在networking连接超时之后)。重新下载依赖项并同步项目(需要networking) Gradle构build过程(守护进程)的状态可能已损坏。 停止所有的Gradle守护进程可能会解决这个问题。 停止Gradle构build过程(需要重新启动) 您的项目可能使用与项目中的其他插件或项目请求的Gradle版本不兼容的第三方插件。 在损坏的Gradle进程的情况下,您也可以尝试closuresIDE,然后杀死所有的Java进程。 我已经尝试了前两个选项,第三方插件是默认的。 gradle-wrapper.properties #Thu May 18 08:36:52 BST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-milestone-1-all.zip 的build.gradle // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.1.2-3' repositories { maven { […]
在Kotlin中,如果您不想在构造函数或类体顶部启动类属性,则基本上有以下两个选项(来自语言参考): 延迟初始化 lazy()是一个函数,它接受一个lambda并返回一个Lazy实例,它可以作为实现一个lazy属性的委托:get()的第一个调用执行传递给lazy()的lambda并记住结果,随后的调用得到()只是返回记忆的结果。 例 public class Hello{ val myLazyString: String by lazy { "Hello" }` } 所以第一个调用和次要的调用,无论它在哪里, myLazyString都会返回“Hello” 延迟初始化 通常,声明为具有非nulltypes的属性必须在构造函数中初始化。 但是,这往往不方便。 例如,可以通过dependency injection来初始化属性,也可以在unit testing的设置方法中初始化属性。 在这种情况下,你不能在构造函数中提供一个非null初始值设定项,但是当你引用一个类的内部属性的时候,你还是要避免使用null检查。 要处理这种情况,可以使用lateinit修饰符标记属性: public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } } 修饰符只能用于在类的主体内声明的var属性(不在主构造函数中),只有当属性没有自定义getter或setter时。 属性的types必须是非空的,并且不能是原始types。 那么,如何正确select这两个选项,既然他们都能解决同样的问题呢?
我有一个Kotlin源文件,但是我想把它翻译成Java。 我如何将Kotlin转换为Java源代码?