具有泛型返回类型的访问者模式的Java/Kotlin强制转换异常
我尝试使用类似访问者模式的东西,带有返回值 然而,尽管没有显式强制转换,但我得到了一个ClassCastException:具有泛型返回类型的访问者模式的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.
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(" ")
}
// ...
}