我正在用Android Studio将Java转换为Kotlin.我在实例变量后获得双重爆炸.什么是双重爆炸,更重要的是这在哪里记录?
mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))
Run Code Online (Sandbox Code Playgroud) 正如JPA所要求的那样,@Entity类应该有一个默认(非arg)构造函数,用于在从数据库中检索对象时实例化对象.
在Kotlin中,在主构造函数中声明属性非常方便,如下例所示:
class Person(val name: String, val age: Int) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
但是当非arg构造函数被声明为次要构造函数时,它需要传递主构造函数的值,因此需要它们的一些有效值,如下所示:
@Entity
class Person(val name: String, val age: Int) {
private constructor(): this("", 0)
}
Run Code Online (Sandbox Code Playgroud)
在情况下,当性能有一些更复杂的类型不只是String和Int他们是不可为空的,它看起来完全坏为他们提供价值,尤其是当有在主构造和太多的代码init块,当这些参数都在积极使用- - 当他们通过反射重新分配时,大部分代码将再次执行.
此外,val在构造函数执行后,-properties不能重新分配,因此不可变性也会丢失.
所以问题是:Kotlin代码如何适应JPA而不需要代码重复,选择"神奇"的初始值和失去不变性?
PS除了JPA之外,Hibernate是否可以构造没有默认构造函数的对象?
这两个接口都只定义了一种方法
public operator fun iterator(): Iterator<T>
Run Code Online (Sandbox Code Playgroud)
文档说Sequence是懒惰的.但是也不是Iterable懒惰(除非由a支持Collection)?
在Kotlin中,具有至少一个参数的函数可以定义为常规非成员函数,也可以定义为扩展函数,其中一个参数是接收者.
对于范围界定,似乎没有区别:两者都可以在类和其他函数内部或外部声明,并且两者都可以或不可以具有相同的可见性修饰符.
语言参考似乎不建议在不同情况下使用常规函数或扩展函数.
所以,我的问题是:扩展功能何时优于常规非成员功能?当常规的扩展?
foo.bar(baz, baq)VS bar(foo, baz, baq).
它只是一个函数语义的提示(接收器肯定是焦点)或是否有使用扩展函数使代码更清洁/开辟机会的情况?
在我的Kotlin项目中,我有一些Java代码,我想将其转换为Kotlin.将Java文件转换为Kotlin的菜单项被禁用,因为它不是我想要转换的整个文件.
如何将Java代码转换为Kotlin?
我有以下数据类
data class PuzzleBoard(val board: IntArray) {
val dimension by lazy { Math.sqrt(board.size.toDouble()).toInt() }
}
Run Code Online (Sandbox Code Playgroud)
我读到Kotlin中的数据类可以免费获得equals()/ hashcode()方法.
我实例化了两个对象.
val board1 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0))
val board2 = PuzzleBoard(intArrayOf(1,2,3,4,5,6,7,8,0))
Run Code Online (Sandbox Code Playgroud)
但是仍然以下语句返回false.
board1 == board2
board1.equals(board2)
Run Code Online (Sandbox Code Playgroud) 这是将字符串添加到Extras的方式:
Intent i = new Intent();
i.putExtra("Name", edt_name.getText());
i.putExtra("Description", edt_desc.getText());
i.putExtra("Priority", skb_prior.getProgress());
setResult(RESULT_OK, i);
finish();
Run Code Online (Sandbox Code Playgroud)
这是我尝试提取它们的方式onActivityResult():
String name = data.getStringExtra("Name");
String desc = data.getStringExtra("Description");
int prior = data.getIntExtra("Priority", 50);
Run Code Online (Sandbox Code Playgroud)
但第二个代码块后name和desc是null的,虽然prior有它应有的价值.此外,在调试器中,我可以看到,它data.mExtras.mMap包含所需的字符串,但仅在第一次请求之后.
我试图让Kotlin在spring-data-rest项目上使用jsr 303验证.
给出以下数据类声明:
@Entity data class User(
@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
var id: Long? = null,
@Size(min=5, max=15)
val name: String
)
Run Code Online (Sandbox Code Playgroud)
@Size注释在这里没有任何效果,使我能够保存名称为1个字符的用户.
它在执行相同的示例时效果很好,但在Java类而不是Kotlin中.
这让我想起了Kotlin问题.
在此先感谢您的帮助!
我喜欢这个Swift语法; 它对很多东西很有帮助:
var foo: Bar = Bar() {
willSet {
baz.prepareToDoTheThing()
}
didSet {
baz.doTheThing()
}
}
Run Code Online (Sandbox Code Playgroud)
我很乐意在Kotlin这样做.但是,我找不到合适的语法!
Kotlin有什么相似的东西吗?
var foo: Bar = Bar()
willSet() {
baz.prepareToDoTheThing()
}
didSet() {
baz.doTheThing()
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个数据类
data class Something (
val a : String,
val b : Object,
val c : String
)
Run Code Online (Sandbox Code Playgroud)
在我的程序中稍后我需要这个数据类的字符串表示我试图扩展toString方法.
override fun Something.toString() : String = a + b.result() + c
Run Code Online (Sandbox Code Playgroud)
这里的问题是,它不允许扩展(覆盖)toString功能,因为它不适用于顶级功能.
如何正确覆盖/扩展自定义数据类的toString方法?