具有泛型返回类型的访问者模式的Java/Kotlin强制转换异常

具有泛型返回类型的访问者模式的Java/Kotlin强制转换异常,java,generics,kotlin,type-erasure,visitor,Java,Generics,Kotlin,Type Erasure,Visitor,我尝试使用类似访问者模式的东西,带有返回值 然而,尽管没有显式强制转换,但我得到了一个ClassCastException: Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.CharSequence; at Printer.combine(...) at Split.accept(...) at MWEKt.

我尝试使用类似访问者模式的东西,带有返回值

然而,尽管没有显式强制转换,但我得到了一个ClassCastException:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.CharSequence;
    at Printer.combine(...)
    at Split.accept(...)
    at MWEKt.main(...)
代码:


Java案例的错误是相同的。

我很确定这是这个问题的重复:

但是,为了提供一个特定的解决方案,您可以用
列表
替换
vararg
参数,这样就可以了:

class Split(val left: TreeElem, val right: TreeElem) : TreeElem {
    override fun <T> accept(visitor: TreeVisitor<T>): T {
        return visitor.combine(listOf(
                visitor.visit(this),
                left.accept(visitor),
                right.accept(visitor)))
    }
}

interface TreeVisitor<T> {
    fun combine(inputs: List<T>): T
    // ...
}

class Printer : TreeVisitor<CharSequence> {
    override fun combine(inputs: List<CharSequence>): CharSequence {
        return inputs.joinToString(" ")
    }
    // ...
}
类拆分(val left:TreeElem,val right:TreeElem):TreeElem{
覆盖乐趣接受(访问者:TreeVisitor):T{
返回访客。合并(列表)(
参观者,参观(这个),
左。接受(访客),
对,接受(访客)
}
}
接口树定位器{
有趣的联合收割机(输入:列表):T
// ...
}
类别打印机:TreeVisitor{
覆盖联合收割机(输入:列表):CharSequence{
返回输入。joinToString(“”)
}
// ...
}

虽然没有那么漂亮,但它对泛型的作用很好。

这很有道理,谢谢!不知何故,我没有认出
[L
,或者我可能意识到演员阵容失败了,因为它是一个数组……这是一件容易错过的事情,经常发生在我身上:)
class Split(val left: TreeElem, val right: TreeElem) : TreeElem {
    override fun <T> accept(visitor: TreeVisitor<T>): T {
        return visitor.combine(listOf(
                visitor.visit(this),
                left.accept(visitor),
                right.accept(visitor)))
    }
}

interface TreeVisitor<T> {
    fun combine(inputs: List<T>): T
    // ...
}

class Printer : TreeVisitor<CharSequence> {
    override fun combine(inputs: List<CharSequence>): CharSequence {
        return inputs.joinToString(" ")
    }
    // ...
}