Java泛型转Kotlin后出现类型不匹配错误,求解决方法
修复Kotlin泛型类型不匹配错误
将Java泛型代码转换为Kotlin后出现类型不匹配错误,原Java代码运行正常,转换后的Kotlin代码报错。
原Java代码
public class Test { public void getList() { List<Parent> list = join( Parent.Child1.values(), Parent.Child2.values() ); } public interface Parent { enum Child1 implements Parent {} enum Child2 implements Parent {} } public <T> List<T> join(T[]... collections) { ArrayList<T> result = new ArrayList<>(); for (T[] collection : collections) { result.addAll(Arrays.asList(collection)); } return result; } }
转换后出错的Kotlin代码
class Test2 { val list: Unit get() { val list = join<Parent>( Parent.Child1.values(), Parent.Child2.values() ) } interface Parent { enum class Child1 : Parent enum class Child2 : Parent } fun <T> join(vararg collections: Array<T>): List<T> { val result = ArrayList<T>() for (collection in collections) { result.addAll(collection.toList()) } return result; } }
错误原因
- Kotlin数组是不变类型,而Java数组支持协变:Java中
Child1[]可以直接作为Parent[]使用,但Kotlin里Array<Child1>无法直接赋值给Array<Parent>,这是类型不匹配的核心原因。 - 原Kotlin代码的
list属性定义错误:类型被设为Unit,且getter方法没有返回值,仅定义了局部变量。
修复方案
- 修改
join函数的参数类型为Array<out T>,利用Kotlin的声明处协变特性,允许传入Array<Child1>、Array<Child2>这类T的子类型数组。 - 修正
list属性的类型为List<Parent>,并在getter中返回正确的结果。
修复后的完整代码
class Test2 { val list: List<Parent> get() { return join( Parent.Child1.values(), Parent.Child2.values() ) } interface Parent { enum class Child1 : Parent enum class Child2 : Parent } fun <T> join(vararg collections: Array<out T>): List<T> { val result = ArrayList<T>() for (collection in collections) { result.addAll(collection.toList()) } return result } }
补充说明
- 使用
Array<out T>后,函数仅能从数组中读取元素(无法写入),完全符合join函数的使用场景——仅需遍历数组并将元素添加到结果列表。 - 可以省略
<Parent>的显式泛型指定,Kotlin会自动推导泛型类型。
内容的提问来源于stack exchange,提问作者Cartman
相关产品推荐
相关产品推荐

