【Scala】 気になったこととその回答のメモ | さすらいびとの徒然漂流記

さすらいびとの徒然漂流記

ふらふら漂流するさすらいびとのように,色々な話題についてお気楽極楽,徒然なるままに…

とりあえず,さすらいびとが気になったことのメモ書きのようなもの.

まだ,不明なところもあるし,これからも増えるかもしれないけど.


Overriding


親メソッドの呼び出し方法はどうなるのか


super.<method name>


Javaと同じってことだね.


メソッド→フィールド→メソッドと override したときの親呼び出しはどうなるのか


original override 可否
def def OK
def val OK
def var NG
val def NG
val val OK
val var NG
var def NG
var val NG
var var NG


この表からすると


メソッドからフィールド(ただし,val

メソッドからメソッド

フィールドのvalからフィールドのval


これらは大丈夫ってことみたいだね.

まあ,これなら問題が発生しないね.



Polymorphism

引数や返り値の型の共変性と反変性はどう扱うのか(override か overload か)
op(a: Type1):Type2としてサブクラスで op(a: Type1a):Type2a はどの場合が可能でどの場合がそれぞれoverride/overloadになるのか


Ta3 extends Ta2 extends Ta1Tb3 extends Tb2 extends Tb1 とすると


class A1 {def op(p: Ta2) : Tb2}


class A2 extends A1 {
    def op(p: Ta2) : Tb2 // override
    def op(p: Ta3) : Tb2 // overload
    def op(p: Ta1) : Tb2 // overload
    def op(p: Ta2) : Tb1 // error
    def op(p: Ta2) : Tb3 // override
}

以上からすると,引数は一致のみで,結果値型は共変ってことだね.

4番目のパターンは override が無いってエラーがでるんだけど,

override をつけると非互換だって文句言われる.


ちなみに,当たり前だけど最初と5番目は同時に定義できない.



Subtyping


object の継承はできるのか


継承はできない.


まあ,シングルトンオブジェクトだから当たり前か.


extendswith の違いは何か


extends with
一度に適用可能な数 1つだけ 0以上
classへの適用 OK NG
それのみの適用 OK NG(extendsと一緒に)
traitへの適用 OK(一つの場合) OK(2個目以降)


なんか使い分けが中途半端なんだよね.



Functional


関数の override は出来るのか(意味があるかはともかく)
その際に元の関数が呼べるのか



Trait


何故 trait の拡張にのみ extends,mix-in には with としなかったのか




Stackable Modification


extendswith の順序はあるのか


上記表を参照



Package


package-info.java に対応するものはあるのか



doc


javadocに対応するものはあるのか


scaladoc というツールがある.



Generics


メソッドの型パラメタが結果値型の場合はどうするのか

型パラメタの lower bound とか使うらしい.


→ っていうか,このときに疑問に思ったのってどういうケースか忘れた…


Abstract type


genericsと何が違うのか


abstract type の継承関係によらずに polymorphic な利用が出来る

→ ただし generic member との違いが不明だが…


generic member の type parameter は個々のメンバで独立しているが,abstract type はクラス全体に適用できる

→ つまりクラスの type parameter のようにmemberのtypeをクラス内で一括指定できる



Annotation


Scalaでは annotation になっているもの


要素 Annotation
volatile @volatile
transient @transient
SerialVersionUID @SerialVersionUID
Serializable @serializable