2015-12-29 21 views
2

如何實現一個通用函數來創建一個空的通用二維數組?在下面的代碼示例中,將創建一個空的1D數組並且具有預期的類型。然而,當我打電話test2D我得到一個錯誤:具有通用二維數組的通用函數

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) 
} 
+1

關於[You Track]的問題(https://youtrack.jetbrains.com/issue/KT-10555) –

回答

1

我覺得你是一個級別太深的物化參數。也許這是一個錯誤,創建一個YouTrack issue將有助於找出。

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) 
} 

後創建YouTrack問題,請在這裏發表的發行數量爲跟蹤:當你讓T是整個內部數組此代碼的工作。