Kotlin中的单个感叹号是什么意思?我已经看过几次,特别是在使用Java API时.但我在文档和StackOverflow中都找不到它.
我正在使用Kotlin和Realm编写数据类
data class AuthToken(val register: Boolean,
val token: String,
val tokenSecret: String,
val user: AuthUser)
Run Code Online (Sandbox Code Playgroud)
我必须将数据保存到db,所以我使用Realm来保存它.但是正如我们所知,如果我想将类保存到Realm,那么AuthToken
该类必须扩展RealmObject
.
这就是问题,Kotlin说数据类不能扩展类.所以我放弃数据类,只使用普通的Kotlin类作为模型,然后另一个问题来了:
Kotlin类没有吸气剂或固定剂.我们知道Realm类必须将所有属性设置为private并编写getter和setter.
现在我想知道如何解决这个问题.
如果我有一个类似的字符串"mypackage.MyClass"
,我如何KClass
在运行时(从JVM)获得相应的?
在Kotlin中查看此示例代码:
fun foo(bar: Int = 0, baz: Int) {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
在将其反编译为Java代码(工具 - > Kotlin - >显示Kotlin字节码 - >反编译)之后,我得到了以下代码
public static final void foo(int bar, int baz) {
}
// $FF: synthetic method
// $FF: bridge method
public static void foo$default(int var0, int var1, int var2, Object var3) {
if ((var2 & 1) != 0) {
var0 = 0;
}
foo(var0, var1);
}
Run Code Online (Sandbox Code Playgroud)
我注意到生成的Java方法有一个未使用的Object var3
参数.
我有点认为它可能与类中的函数有关,但在反编译此代码时
class Foo {
fun foo(bar: Int = 0, baz: Int) …
Run Code Online (Sandbox Code Playgroud) 在Kotlin中,我如何定义var
具有惰性默认值的?
例如,a val
会是这样的:
val toolbarColor by lazy {color(R.color.colorPrimary)}
Run Code Online (Sandbox Code Playgroud)
我想要做的是,有一些属性(toolbarColor
)的默认值,我可以改变其他任何值.可能吗?
编辑:这是部分技巧.
var toolbarColor = R.color.colorPrimary
get() = color(field)
set(value){
field = value
}
Run Code Online (Sandbox Code Playgroud)
是否可以通过写作来缓解这种情况
var toolbarColor = color(R.color.colorPrimary)
set(value){
field = value
}
Run Code Online (Sandbox Code Playgroud)
以某种方式懒惰地计算默认值?目前它不起作用,因为color()
需要的Context
只是稍后初始化.
给出以下代码
fun example() {}
fun example(name: String) {}
Run Code Online (Sandbox Code Playgroud)
我如何参考特定功能?即example()
或example(String)
?
使用[example]
我无法指定我想要的功能.
如果Kotlin函数调用为原语提供了原因,Int
那么"传递的"类就是盒装基元的类,而不是未装箱的版本.
inline fun <reified T> reify() = T::class
@Test fun reified_type_doesnt_match_for_primitive() {
assertNotEquals(Int::class, reify<Int>())
assertNotEquals(Int::class.java, reify<Int>().java)
assertNotEquals<Any>(Int::class, reify<Int?>())
val nullableInt: Int? = 42
assertNotEquals(nullableInt!!.javaClass.kotlin, reify<Int>())
assertEquals<Any>(java.lang.Integer::class.java, reify<Int>().java)
}
@Test fun reified_type_matches_for_class() {
assertEquals(String::class, reify<String>())
}
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?
按照Exposed提供的示例,我无法在创建它的事务之外读取创建的表/数据.我正在使用h2-in-memory数据库.
例外是:
Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "CITIES" not found; SQL statement:
Run Code Online (Sandbox Code Playgroud)
我已经添加了一个提交调用,但这没有帮助.如果我在创建数据的事务中读取数据,就像在github链接上的示例一样,它可以正常工作.这是它的简化版本:
fun main(args: Array<String>) {
Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
transaction {
create(Cities)
City.new {
name = "St. Petersburg"
}
println("Cities: ${City.all().joinToString { it.name }}")
//I have added this commit here
commit()
}
//I want to read the data outside the transaction, but it does not work
transaction {
println("Cities: ${City.all().joinToString { it.name }}")
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何保存数据?
添加logger.addLogger(StdOutSqlLogger)
提供以下输出:
SQL: CREATE TABLE IF NOT EXISTS …
Run Code Online (Sandbox Code Playgroud) 鉴于以下功能
fun function(x: Int = 12) {
println("x = $x")
}
Run Code Online (Sandbox Code Playgroud)
如何使用反射调用它而不指定x
(或以某种方式使用默认值,而不是硬编码)?
我经常 看到 的 @InlineOnly
注解浏览科特林的STDLIB时.据我所知,注释只发生在inline
功能上.这个注释的目的是什么?inline
功能总是内联不是很明显吗?它的文档并没有多大帮助
指定不应在没有内联的情况下直接调用此函数
是否可以调用内联函数而不是内联函数?