2016-09-11 4 views
0

Например, List.contains, вот исходный код scala api.Какова цель или значение: в scala

def contains[A1 >: A](elem: A1): Boolean = { 
    var these = this 
    while (!these.isEmpty) { 
    if (these.head == elem) return true 
    these = these.tail 
    } 
    false 

Я понимаю, взаимосвязанность теории коды, но что о типе A1 >: A?

Я думаю, >: как isInstanceOf или что-то вроде того, чтобы ограничить тип входного параметра?

Может кто-нибудь дать краткое объяснение или некоторые документы, так что я могу получить некоторые исследования

ответ

0

A>:B означает B это нижний тип граница A

3

Смысл:

A1 является ближайшего общего предка A и заданного типа аргумента.

Цель:

так List объявлен как List[+A], где +A означает "ковариантный по типу А", с использованием A в качестве типа аргумента не допускается:

scala> :pa 
// Entering paste mode (ctrl-D to finish) 

class List[+A] { 
    def m(x: A) = x 
} 

// Exiting paste mode, now interpreting. 

<console>:15: error: covariant type A occurs in contravariant position in type A of value x 
     def m(x: A) = x 

ОБНОВЛЕНИЕ

Наивное объяснение почему нет (просто догадаться, это сложно доказать, поскольку компилятор не допустит этого):

class List[+A] { 
    def m(x: A) = x 
} 

class Fruit 
class Apple extends Fruit 
class Pear extends Fruit 

// list is covariant, which means 
// List[Fruit] is a supertype of List[Apple] 
val l: List[Fruit] = new List[Apple] 
// i.e. l.m has to accept Fruit 
l.m(new Pear) // Apple? 

в реальности:

class List[+A] { 
    def m[A1 >: A](x: A1) = x 
} 

... 

l.m(new Pear) // Fruit, the nearest common ancestor of Apple and Pear 
+0

Я был озадачен содержит метод подписи визави его поведение принимать аргумент любого типа. Таким образом, метод contains is * not * type safe. Разве у дизайнеров не было способа сделать безопасный тип содержимого безопасным? – Samar

+0

Почему он не безопасен? В моем последнем примере то, что возвращается, не 'Object', это близкий общий предок' Pear' и 'Apple'. Так что это не _any_ тип. –

+0

Давайте скажем 'val ls: List [Int] = List (1,2,3,4)'. Теперь, согласно сигнатуре метода 'contains', аргумент типа' A1' должен быть супер-типом 'Int'. Но мы можем передать аргумент любого типа в 'contains', и компилятор не жалуется. Это меня смущает. – Samar

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