小编Ily*_*lya的帖子

对于超类型的直接子类型,不允许进行投影

我有一个像下面这样的抽象类:

abstract class AbstractSync<out C : Configuration<*>> : ISync {
    internal abstract val configuration: C
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想要另一个继承自此的抽象类:

abstract class CascadedSync : AbstractSync {}
Run Code Online (Sandbox Code Playgroud)

CascadedSync类不应该修改泛型参数C,实际上它应该只实现一个ISync方法而不是其他方法.

我正在尝试不同的语法来实现这个看似简单的任务.在Java中,这看起来像这样:

abstract class CascadedSync extends AbstractSync {    
}
Run Code Online (Sandbox Code Playgroud)

在IntelliJ的帮助下将其翻译成Kotlin会产生以下结果:

abstract class CascadedSync : AbstractSync<*>()
Run Code Online (Sandbox Code Playgroud)

但同时给出以下错误:

对于超类型的直接子类型,不允许进行投影

什么是正确的语法?

generics kotlin

5
推荐指数
1
解决办法
1403
查看次数

类型不匹配:推断类型为Int但预期为Byte

我正在尝试kotlin,我在这里有一个简单的例子:

var byteToAdd: Byte = 3
var byteArray = byteArrayOf(1, 2, 3, 4, 5)
byteArray[0] += byteToAdd
println(byteArray[0])
Run Code Online (Sandbox Code Playgroud)

但在执行的时候,我得到的第3行的错误,因为它说,这byteToAdd是一个Integer,即使我设置的类型byteToAdd,以Byte1号线.

为什么会这样?

casting kotlin

5
推荐指数
1
解决办法
505
查看次数

将 Kotlin MutableMap 转换为 java.util.HashMap

我正在处理一个相当古老的项目,其中包含大量 Java 代码,要替换它,这太麻烦了,而且由于 kotlin 比 Java 好得多,我正在尝试将所有新代码混合在一起kotlin 中的代码,但是当我尝试使用此 kotlin 代码访问 java 代码时

val params = mutableMapOf<String, String>(
    "name" to response.name,
    "type" to response.type
)
product.params = params
Run Code Online (Sandbox Code Playgroud)

我在下面有一个红色下划线params,它说

Required: Hashmap<String!, Any!>!
Found: MutableMap<String, String>
Run Code Online (Sandbox Code Playgroud)

这是我的 java setter

public void setParams(HashMap<String, Object> params){
    this.params = params;
}
Run Code Online (Sandbox Code Playgroud)

我可以在不更改 java 代码的情况下解决这个问题吗?如果可能,请提供帮助,如果可能,请提供帮助,以及解决此问题的解决方法是什么。

java hashmap kotlin

5
推荐指数
2
解决办法
6185
查看次数

Kotlin-js:定义小数位数

让我们想象一下这样的事情:

var num: Float = 0.0f
num = 2.4 * 3.5 / 3.8
Run Code Online (Sandbox Code Playgroud)

num 有几个小数,但我只想要2.

在JS我会用num.toFixed(2).

这里的其他答案建议使用"%.2f".format(num)num.format(2).后者需要自定义扩展乐趣:

fun Double.format(digits: Int) = java.lang.String.format("%.${digits}f", this)
Run Code Online (Sandbox Code Playgroud)

但是,这些选项中的任何一个都会导致"未解析的引用"的编译器错误.我不认为是进口的问题,因为编译器会建议它.

是否有捷径可寻?

kotlin

4
推荐指数
1
解决办法
1153
查看次数

Kotlin 中的数组声明大小是否可以仅通过初始化来实现?

我没有找到如何在Kotlin中声明具有预定义大小的数组而不对其进行初始化。

还行吧:

lateinit var v:Array<Int>
Run Code Online (Sandbox Code Playgroud)

但我猜想不能在数组类型中指定大小。

如果需要指定尺寸。必须做的事:

var v2:Array<Int> = Array<Int>(2){5}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,向量的所有元素都等于 5

下面是一个包含类和数组的示例:

data class But(
    val fufo: Int=0,
    val tp: Int = 1 
)  
typealias  ArBut = Array<But>
data class CArray (
   var arrayC: ArBut = ArBut(2){But()}
)    
val a =   CArray(arrayOf(But(2,2),But(5,4),But(3,3)))
println(a.arrayC[2])
Run Code Online (Sandbox Code Playgroud)

有用!有趣的是,初始化不是类型的一部分,您可以将任意大小的数组放入类中,而无需进行边界检查。如果尺寸是类型规格的一部分,情况会有所不同。

现在是一个例子,使用矩阵。请注意,语法有点复杂。

data class CMatr (
   val matrC: Array<ArBut>  = Array<ArBut>(2){ArBut(0){But()}}
)    
 val m =   CMatr(arrayOf( arrayOf(But(2,2),But(5,4)),   
         arrayOf(But(-2,2),But(3,4)), arrayOf(But(1,1),But(5,3))  ))
 println(m.matrC[2][1])  // Also works! 
Run Code Online (Sandbox Code Playgroud)

是否不可能将大小放入数组类型规范中,或者我遗漏了一些东西?

arrays kotlin

4
推荐指数
1
解决办法
5303
查看次数

为什么这堂课被认为是最终的?

我试图继承以下类型,但编译器说它是最终的.

class Dice(private var side : Int)
{
    constructor(D : DiceTypesK) : this(D.value) {}
}

class ExplodedDice(private val D : DiceTypesK) : Dice(D) 
                                              // ^^^^ this class is final and
                                              //      can not be inherited from
Run Code Online (Sandbox Code Playgroud)

为什么我的类型是最终的,因为我不打算这样做?

inheritance kotlin

3
推荐指数
1
解决办法
127
查看次数

println()产生不同的输出

fun main(args: Array<String>) {

  var _array = arrayOf(1 , 2 , 3.14 , 'A', "item" , "a b c d", 4)

  println("$_array[3]")  // [Ljava.lang.Object;@1b6d3586[3]
  println("${_array[3]}") // A
  println(_array[3]) // A

  println( _array[3] + " is _array's item") // ERROR
  println( "" + _array[3] + " is _array's item") // A is _array's item

} 
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么上面的代码产生不同的输出

string-interpolation kotlin

3
推荐指数
1
解决办法
77
查看次数

如何在 kotlin 中将字符转换为其整数值?

我正在尝试使用我在这个答案toInt()中找到的函数将字符串转换为 Kotlin 中的整数值,但我得到的是 ascii 值。

我做错了什么?

var input = "8569 2478 0383 3437"

val regex = "[^0-9]".toRegex()
var value = regex.replace(input, "")

val iterator = value.iterator()

var sum : Int = 0
var v : Int
for((index, value) in iterator.withIndex()){
    if(index % 2 == 0){
        var v = value.toInt() * 2 
        if(v > 9) v -= 9

        print("$v:$value ")
        sum += v
    }else{
        print("$value ")
        sum += value.toInt()
    }
}
Run Code Online (Sandbox Code Playgroud)

执行上面的代码,这是打印的数字

103:8 5 99:6 9 91:2 4 101:7 …
Run Code Online (Sandbox Code Playgroud)

kotlin

3
推荐指数
1
解决办法
5722
查看次数

Kotlin:如果 E 是实现接口 I 的枚举类,则从返回类型为 Array&lt;I&gt; 的函数中返回 Array&lt;E&gt;

最近我遇到了一个问题,我有一个函数必须返回一个Is数组,以 enum 的所有值的形式EE实现 interface I,我想到的每个代码编译器都抱怨类型不匹配:

Error:(x, x) Kotlin: Type mismatch: inferred type is Array<E> but Array<I> was expected
Run Code Online (Sandbox Code Playgroud)

一个最小的例子:

    interface I {}
    enum class E: I {
        A, B, C;
    }
    fun getMoreInterfaces(): Array<I> {
        return E.values()
    }
Run Code Online (Sandbox Code Playgroud)

当尝试分配E.values()给类型的变量时会发生这种情况,Array<I> 我很确定这应该是可能的,因为E实现了I.

我在测试时想到的另一件事是,像这样使用时它工作得很好:

    interface I {}
    enum class E: I {
        A, B, C;
    }
    fun getMoreInterfaces(): Array<I> {
        return arrayOf(E.A, E.B, E.C)
    }
Run Code Online (Sandbox Code Playgroud)

我在这个主题上做了很多搜索,但没有运气(也许我选择了错误的描述方式?)

enums type-mismatch generic-variance kotlin

3
推荐指数
1
解决办法
4798
查看次数

我无法理解 Kotlin 中的 generateSequence 函数

我对generateSequenceKotlin 中的感到困惑。我似乎阅读手册都错了:

这是函数签名(用于generateSequence种子):

fun <T : Any> generateSequence(
    seed: T?, 
    nextFunction: (T) -> T?
): Sequence<T>
Run Code Online (Sandbox Code Playgroud)

所以Sequence应该是相同类型的种子,下一个值也应该是下一个迭代代......

但是男人的例子是:

fun fibonacci(): Sequence<Int> {
    return generateSequence(Pair(0, 1), { Pair(it.second, it.first + it.second) }).map { it.first }
}
?
println(fibonacci().take(10).toList()) // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Run Code Online (Sandbox Code Playgroud)

所以看起来SequenceisInt的类型是种子 is Pair<Int, Int>

生成器函数映射Pair<Int, Int>TO Int。下一个值如何发送到生成器,下一个Pair<Int, Int>构造在哪里(生成器的输出是Int...)?

这个函数到底是怎么知道什么时候停止的?生成器永不返回null

kotlin

3
推荐指数
1
解决办法
1284
查看次数