在Kotlin项目中使用@Value注释时编译器警告

时间:2017-07-24 17:52:33

标签: java spring kotlin

Kotlin语言中是否有任何类型我可以在后期初始化而不是class SomeClass { @Value(#{config['poolCapacity']?:'5000'}) lateinit var somePool: Integer } 中使用,以便我不会收到编译器警告?

假设我有一个类似这样的课程:

Int

我无法使用Kotlin中的lazeint类型,因为它是原始类型而java.lang.Integer不接受它。

如果我坚持var i, frames; frames = document.getElementsByTagName("iframe"); for (i = 0; i < frames.length; ++i) { // The iFrame if (!frames[i].hasAttribute("allowfullscreen")) { frames[i].setAttribute('allowFullScreen', '') } } 它的工作正常但我收到了这种编译警告:

  

SomeClass.kt:(20,24):这个类不应该在Kotlin中使用。使用   kotlin.Int代替。

显然我可能会自己创建所需的类型,但我只是想知道是否有开箱即用的东西,并建议我们应该在这种情况下使用而我根本找不到它? (在这种特殊情况下,带注释的构造函数不是解决方案)。

1 个答案:

答案 0 :(得分:4)

最简单的解决方案是不要使用后期初始化属性,因为Kotlin后期初始化属性现在不支持基本类型,并且可以使用spring表达式的默认值对其进行初始化,例如:

@Value(#{config['poolCapacity']?:'5000'})
var somePool: Int = 5000

您可以编写委派属性的复杂示例,但必须在setter @set网站目标而不是field / property进行注释,例如:< / p>

@set:Value(#{config['poolCapacity']?:'5000'})
var value by required<Int>()
inline fun <reified T> required(): ReadWriteProperty<Any, T> {
    return object : ReadWriteProperty<Any, T> {
        var value: T? = null;
        override fun getValue(thisRef: Any, property: KProperty<*>): T = value as T

        override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
            this.value = value;
        }

    }
}