Wygląda na to, że nie rozumiem czegoś ważnego, może o wymazaniu (cholera).Nie można znaleźć wartości domyślnej dla parametru dowodu typu scala.reflect.ClassManifest [T]
Mam metodę, którą chciał stworzyć tablicę wielkości n
wypełniona wartościami od gen
:
def testArray[T](n: Int, gen: =>T) {
val arr = Array.fill(n)(gen)
...
}
i używać go na przykład jako:
testArray(10, util.Random.nextInt(10))
Ale otrzymuję błąd :
scala: could not find implicit value for evidence parameter of type scala.reflect.ClassManifest[T]
val arr = Array.fill(n)(gen)
^
Proszę wyjaśnić, co zrobiłem źle, dlaczego ten błąd, i jakiego rodzaju kodu to uniemożliwia?
Rzeczywiście to pomaga. ClassManifest, ponieważ trochę pamiętam, to narzędzie do radzenia sobie z wymazywaniem typów? Czy możesz wyjaśnić, w jaki sposób konstruowanie '[T: ClassManifest]' faktycznie rozwiązuje problem?Przepuszcza w sposób jawny instancję 'ClassManifest [T]' od miejsca, gdzie znane jest 'T'? – dmitry
Nawiasem mówiąc, mam jeszcze jeden podobny problem :) Wewnątrz 'testArray' po' Array.fill' próbuję utworzyć instancję klasy, która używa ukrytego porządkowania, zadeklarowanego jako 'MyClass [T] (seq: Array [T]) (implicit ord: Ordering [T]) '. Tak więc, w 'nowej MyClass (arr)' widzę 'Brak domyślnego porządku zdefiniowanego dla T'. Czy istnieje szansa, że będę mógł użyć manifestu, aby to rozwiązać? Może utworzyć zamówienie przy użyciu ClassManifest? – dmitry
Aby uzyskać instancję 'Ordering [A]' po prostu dodaj jako kontekst związany. 'def testArray [T: ClassManifest: Ordering] (n: Int, gen: => T)'. Jak już napisałem w poście, kompilator przejdzie przez niejawne instancje, gdy dodasz granice kontekstu do parametrów twojego typu. – drexin