与普通的二维阵列的通用功能 [英] Generic function with generic 2D array

查看:123
本文介绍了与普通的二维阵列的通用功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何才能实现它创建一个空的通用二维数组泛型函数?在下面的code样品空维数组被创建并有预期的类型。然而,当我打电话test2D我得到一个错误:

java.lang.ClassCastException:[Ljava.lang.Object;不能转换为[Ljava.lang.Integer;

 在线娱乐与LT;物化T> make1D(面膜:数组< T>):数组< T> {
  VAL RES:数组< T> = arrayOf()
  返回水库
}@测试
有趣test1D(){
  VAL一个:数组<&诠释GT; = arrayOf(0)
  VAL乙:阵列<&诠释GT; = make1D(一)
  的assertEquals(0,b.size)
}在线娱乐和LT;物化T> make2D(面膜:数组<数组< T>>):数组<数组< T>> {
  VAL RES:数组<数组< T>> = arrayOf()
  //我希望T可等于从下面的测试呼叫时,INT,
  //和资源有整数[] []类型;
  然而//它有对象[] []类型,而不是
  返回水库
}@测试
有趣test2D(){
  VAL一个:数组<数组<&诠释GT;> = arrayOf(arrayOf(0))
  VAL乙:阵列<数组<&诠释GT;> = make2D(一)
  的assertEquals(0,b.size)
}


解决方案

我觉得你是一个级别太深的物化参数。也许这是一个错误,创建一个 YouTrack问题将有助于找到答案。这code ++工程,当你让 T 是整个内数组:

 在线娱乐与LT;物化T> make2D(面膜:数组< T>):数组< T> {
    VAL RES:数组< T> = arrayOf< T>()
    返回水库
}@测试
有趣test2D(){
    VAL一个:数组<数组<&诠释GT;> = arrayOf(arrayOf(0))
    VAL乙:阵列<数组<&诠释GT;> = make2D(一)
    的assertEquals(0,b.size)
}

创建YouTrack问题后,请在这里发表的发行数量进行跟踪。

How can one implement a generic function which creates an empty generic 2D array? In the following code sample an empty 1D array is created and has the expected type. However, when I call test2D I get an error:

java.lang.ClassCastException: [[Ljava.lang.Object; cannot be cast to [[Ljava.lang.Integer;

inline fun <reified T> make1D(mask: Array<T>) : Array<T> {
  val res : Array<T> = arrayOf()
  return res
}

@Test
fun test1D() {
  val a : Array<Int> = arrayOf(0)
  val b : Array<Int> = make1D(a)
  assertEquals(0, b.size)
}

inline fun <reified T> make2D(mask: Array<Array<T>>) : Array<Array<T>> {
  val res : Array<Array<T>> = arrayOf() 
  // I expect T to be equal to Int when calling from test below, 
  // and res to have Integer[][] type;
  // however it has Object[][] type instead
  return res
}

@Test
fun test2D() {
  val a : Array<Array<Int>> = arrayOf(arrayOf(0))
  val b : Array<Array<Int>> = make2D(a)
  assertEquals(0, b.size)
}

解决方案

I think you are one level too deep for the reified parameter. Maybe it is a bug, creating a YouTrack issue will help to find out. This code works when you let T be the whole inner array:

inline fun <reified T> make2D(mask: Array<T>): Array<T> {
    val res: Array<T> = arrayOf<T>()
    return res
}

@Test
fun test2D() {
    val a: Array<Array<Int>> = arrayOf(arrayOf(0))
    val b: Array<Array<Int>> = make2D(a)
    assertEquals(0, b.size)
}

After you create a YouTrack issue, please post the issue number here for tracking.

这篇关于与普通的二维阵列的通用功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆