2016-06-22 3 views
1

У меня есть один абстрактный класс с параметром типа и несколько его реализаций:Наследование классов параметров типа в Scala

abstract class AbstractClass[T] { 
    def func: T 
} 

class DoubleClass extends AbstractClass[Double]{ 
    def func = 0.0 
} 

, а затем я хочу создать функцию, которая принимает некоторую последовательность таких объектов:

def someFunc(objs: Iterable[AbstractClass]) = objs.foreach(obj=>println(obj.func)) 

, но он говорит: «Класс AbstractClass принимает параметры типа»

Я новичок в scala и, безусловно, что-то делаю неправильно, но я не могу выяснить, что такое

ответ

5

Он должен в большинстве случаев быть def someFunc[A](objs: Iterable[AbstractClass[A]]). В частности, это позволяет использовать тип возврата в зависимости от A, например.

def someFunc[A](objs: Iterable[AbstractClass[A]]) = objs.map(_.func) 

возвращает Iterable[A].

Иногда вы можете позволить смешать AbstractClass es с различными параметрами. Например. в вашем примере вы просто печатаете func, что всегда можно сделать. В этом случае, как говорит ответ Sascha Кольберг, используйте подстановочные знаки:

def someFunc(objs: Iterable[AbstractClass[_]]) 

Но если вы будете использовать групповые символы постоянно, рассмотреть переосмысление вашего дизайна.

+0

Спасибо, тай, решил мою проблему. –

3

простое решение было бы добавить тип подстановки в качестве аргумента типа для AbstractClass в функции:

def someFunc(objs: Iterable[AbstractClass[_]]) = objs.foreach(obj=>println(obj.func)) 

Таким образом objs может быть итерацию, содержащие любые AbstractClass, поэтому в основном смешанный сбор типа.

Если вы хотите быть уверены, что итерация аргумент someFunc содержит только экземпляры одной реализации AbstractClass [_], вы можете добавить еще один параметр типа в SomeFunc:

def someFunc[A <: AbstractClass[_]](objs: Iterable[A]) = objs.foreach(obj=>println(obj.func)) 

<: типа границы что в основном говорит, что A является подклассом AbstractClass[_]

Смежные вопросы