scala и variance annotations

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

abstract class Element[+Isotype]
 {
 type Isotope; 
var stableIsotopes: Seq[Isotope];
 var unStableIsotopes: Seq[Isotope];
 var name: String; 
var position: Int; 
var isRadioactive : Boolean = false; 
def Element(elemName: String, typicallyRadioactive: Boolean) = {
 isRadioactive = typicallyRadioactive; 
name = elemName 
}

}

class Hydrogen[Map[Int,Int]] extends Element 
{
 def Hydrogen() = { 
Element("hydrogen", false) 
}
}

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Нашел интересную статейку по теме. Теперь хоть понял предназначение variance annotations:

http://blogs.atlassian.com/2013/01/covariance-and-contravariance-in-scala

КОД НА ДОУ?!?!?!
ЗАБАНИН!!!11

trait Element
{
...
val name: String
...
def Element(elemName: String, typicallyRadioactive: Boolean) : Element = {
isTypicalIsotopeRadioactive = typicallyRadioactive
name = elemName
}
}

Не совсем понял, что вы хотели этим сказать.
Если конструктор — то они ж по-другому пишутся (и место им — не в трейтах, а в классах).
Если фабричная функция — то опять же, им место в объектах-компаньонах.

как то как по-другому? ничего не понял про фабричную функцию. и что насчет матов компилятора?

Ну написал я ему конструктор. правда там надо мозговать насчет вызова конструктора наследованного класса конструктора наследуемого класса.

Да нет, фабричный никак не нужен. Ну и как бы вроде конструктор, ничего не возвращает

<console>:8: error: class Hydrogen needs to be abstract, since:
it has 4 unimplemented members.
/** As seen from class Hydrogen, the missing signatures are as follows.
* For convenience, these are usable as stub implementations.
*/
def name_=(x$1: String): Unit = ???
def position_=(x$1: Int): Unit = ???
def stableIsotopes_=: ((x$1: Seq[_3.Isotope])Unit) forSome { val _3: Hydrogen[IntMap] } = ???
def unStableIsotopes_=: ((x$1: Seq[_4.Isotope])Unit) forSome { val _4: Hydrogen[IntMap] } = ???

class Hydrogen[IntMap[Int]] extends Element { def Hydrogen() = { Element("hydrogen", false); val position : Int = 1 } }

Оказалось что если вводить без перевода строки — тогда переваривает

Собственно интересовало несколько вещей:

1. На базе этого кода сделать пример с префиксами +Isotope и -Isotope для абстрактного класса (сделать из него case class?).

2. Для типизац. можно взять Map[Int, Int]. Там типа два числа,, число протонов и число нейтронов. Не вижу сходу типа для хэша.

3. Есть академический интерес привинтить сюда views и использовать функции конвертации типов для извлечения и формировки вывода конфигурации электронной оболочки и типов распада для радиоактивных изотопов.

Любые комментарии к коду и советы по его изменению для демонстрации динамических возможностей scala приветствуются.

Підписатись на коментарі