2017-07-24 68 views
2

Kotlin语言中是否有任何类型可用于后期初始化而不是java.lang.Integer以便我不会收到编译器警告?在Kotlin项目中使用@Value注释时的编译器警告

比方说,我有这样一个类:

class SomeClass { 
@Value(#{config['poolCapacity']?:'5000'}) 
lateinit var somePool: Integer 
} 

我无法从科特林使用Int类型,因为它的基本类型和lazeint不接受它。

如果我坚持java.lang.Integer它工作得很好,但我得到这种编译器警告:

SomeClass.kt:(20,24):此类不应该在科特林使用。改为使用 kotlin.Int。

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

+2

为什么不简单地将它设置为-1或Int.MinValue来标记它没有被初始化? 另一种选择是使用BigInteger(但可能会对性能产生影响) –

+0

@ LiorBar-On我想我已经过时了这个:)简单是一个国王! –

回答

4

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

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

一个复杂的例子,你可以写一个委托属性,但你必须@set站点的目标,而不是field/propertysetter注释,例如:

@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; 
     } 

    } 
} 
+0

我承认这可行,但我不完全确定这是否是唯一可行的解​​决方案。 如果你不介意,我会再给它几天。如果没有人提出更好的建议,我会接受它作为答案。 –

+0

@MateuszChrzaszcz嗨,请看我编辑的答案。 –

+0

是的,当你不能简单地默认它时,它更像是在一个更复杂的情况下! –