2009-09-18 7 views
1

Je viens de convertir Java suivant dans Scala:Scala signatures de type inconsistant: Range.toList et Range.toArray

char[] map = new char[64]; 
int i=0; 
for (char c='A'; c<='Z'; c++) map[i++] = c; 
for (char c='a'; c<='z'; c++) map[i++] = c; 
for (char c='0'; c<='9'; c++) map[i++] = c; 
map[i++] = '+'; 
map[i++] = '/'; 

Ma première tentative a été un tableau:

val map1 = (
    ('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9') 
).toArray[Char] ++ Array('+', '/'); 

Cela fonctionne! Un peu plus de lecture et j'ai réalisé que Array est un type mutable, alors que List est immuable, donc je l'ai changé:

val map1 = (
    ('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9') 
).toList ++ List('+', '/'); 

Le code devient un peu plus facile à lire ici, avec le trait toList ne pas prendre un argument de type , alors que je devais écrire toArray[Char]. Pourquoi? S'agit-il d'une interopérabilité Java, ou s'agit-il d'une incohérence de bibliothèque, avec toList provenant de Iterable et toArray provenant de Collection?

Répondre

2

Vous pouvez concaténer deux listes de types différents; le résultat est une liste de leur ancêtre commun moins:

scala> val l1=List(1) 
l1: List[Int] = List(1) 

scala> val la=List('a') 
la: List[Char] = List(a) 

scala> l1++la 
res4: List[AnyVal] = List(1, a) 

Vous devez utiliser ('a' to 'z') au lieu de ('a' until 'z'+1).

Scala 2.8, .toArray fonctionne très bien - mais cela est probablement parce que Range (to et until) est générique:

scala> 'a' to 'z' 
res3: scala.collection.generic.VectorView[Char,Vector[Char]] = RichChar(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z) 

Je soupçonne que, dans 2.7.x, gamme vous donne toujours ints.

+0

C'est donc une question « fixe à 2,8 ». Merci! –

0

Je ne peux pas reproduire le problème que vous avez mentionné:

Welcome to Scala version 2.7.4.final (Java HotSpot(TM) Client VM, Java 1.6.0_16). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> val map1 = (('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9')).toArray ++ Array('+', '/') 
map1: Array[Char] = Array(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f 
, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, /) 

scala> val map1 = (
    | ('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9') 
    |).toArray ++ Array('+', '/'); 
map1: Array[Char] = Array(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f 
, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, /) 
Questions connexes