2014-10-23 2 views
1

У меня есть функция, которая делает Массивы определенного типа:Scala общие массивы инстанцирует

def mkArray[A:ClassTag:Ordering](size:Int):Array[A] = Array.ofDim[A](size) 

И я хочу, чтобы сделать массив обр типа Int или строки в зависимости от строки ул так:

var arr = if(str=="i"){mkArray[Int](size)}else{mkArray[String](size)} 

и теперь я пытаюсь добавить значения в массив следующим образом:

arr(n) = num.toInt // num is String like "123" 

Но он говорит:

- type mismatch; found : Int required: _366 where type _366 >: Int 
with String 

Как я могу обойти это, сделав arr типа Array [Int] или Array [String] в зависимости от строки str?

Любая помощь с учётом, Thanks!

+0

Вместо использования 'str' со значениями' "я" 'и т.д., можно использовать' mkArray [Int] 'непосредственно. Попробуйте быть более явным для компилятора. – tuxdna

ответ

0

Scala - это статически типизированный язык, а в вашем случае тип arr - Array[_ >: Int with String]. Следовательно, если вы дадите ему Int, вы получите ошибку типа.

В зависимости от того, как вы используете массив далее в своем коде, я бы рекомендовал вам взглянуть на Либо [1], так как это может быть полезно для сохранения массива [Либо] и обработки его с использованием шаблона сопоставление по-разному, когда оно содержит строку Int vs String.

[1] http://danielwestheide.com/blog/2013/01/02/the-neophytes-guide-to-scala-part-7-the-either-type.html

+0

Благодарим вас за ответ. Массив предназначен для использования в качестве входных данных для алгоритма сортировки, а скорость имеет большое значение (его школьный проект), поэтому я думаю, что сравнение непосредственно с Int или String будет намного быстрее, чем использование этого типа. Я реализовал свой собственный класс оболочки значений, который может содержать строку или int, но это было недостаточно быстро для этого назначения. Так можно ли обойти это так, чтобы я мог напрямую сравнивать Интс или Струны? –

+0

Его трудно оптимизировать, не зная точного кода, но вам может быть лучше хранить два массива, один для целых чисел, один для строк. –