Я читал через http://oldfashionedsoftware.com/2008/08/26/variance-basics-in-java-and-scala/Scala контравариантен позиция по методу
и смотрю на код
class CoVar[+T](param1: T) {
def method1(param2: T) = { }
def method2: T = { param1 }
def method3: List[T] = { List[T](param1) }
def method4[U >: T]: List[U] = { List[U](param1) }
val val1: T = method2
val val2: Any = param1
var var1: T = method2
var var2: Any = param1
}
тогда, если бы я должен был иметь
val covar1 = new CoVar(new Car)
val covar2: CoVar[Vehicle] = covar1 //completely legal with covariant
Теперь, давайте идти через методы
- meth od1 - Я не понимаю, почему это не компилируется, и это мой главный вопрос.
- method2 - param1 - это автомобиль и метод2 возвращает транспортное средство, которое отлично, поскольку автомобиль является транспортным средством
- method3 - since Список [Транспортное средство ] возвращается и автомобилей является Vehicle это прекрасно
- var1 - тот же самый вопрос я считаю, и не слишком отличается
Я думаю, это было бы нормально с method1 (парам: Vehicle), так как я могу передать в новый автомобиль просто отлично или новый автомобиль просто отлично
но оригинальный класс CoVar do es не компилируется, так как он говорит, что метод1 является контравариантной позицией. Я думал, что контравариантен будет означать, я мог пройти в
Теперь, проходя через это с ContraVar и method1 мы снова
class ContraVar[-T](param1: T) {
def method1(param2: T) = { }
val val2: Any = param1
var var2: Any = param1
}
val temp1 = new ContraVar(new Car)
val temp2: ContraVar[Ford] = temp1
temp2.method1(new Ford)
temp2.method1(new FordMustang)
temp2.method1(new Car) //fails to compile(good)
которые работают просто отлично. Может кто-нибудь объяснить, почему метод1 ломается на CoVar? Возможно, я возглавляю совершенно неправильный путь на том, что пойдет не так, если бы метод method1 просто компилировался?
спасибо, Dean
hmmmm, так что, если бы они решили разрешить только подклассу Инструмент [+ A] и Tool [Mustang] не поддавались подклассу. то есть. есть ли еще один случай, когда метод1 ломается или будет ли один выбор языка помешать этой проблеме? –
Я не понимаю ваш вопрос. Вы можете создать подкласс 'SubTool [A] extends Tool [A]', где вы решите, что 'A' становится инвариантным. Затем вы можете разрешить 'A' появляться в аргументах метода' SubTool'. –
Ох, неважно, я понял ... Я думаю, что лучше добавить «trait SubTool extends Tool [Mustang] {def treat (m: Mustang) = m.awe()} ok, это делает полный смысл для меня сейчас, когда я думаю об этом так, потому что это типичный шаблон java. Другой способ, которым вы его там путали, пока я немного спал над проблемой и не реформировал ее с точки зрения моих знаний о Java. –