とりあえず,さすらいびとが気になったことのメモ書きのようなもの.
まだ,不明なところもあるし,これからも増えるかもしれないけど.
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 Ta1,Tb3 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 の継承はできるのか
継承はできない.
まあ,シングルトンオブジェクトだから当たり前か.
extends と with の違いは何か
extends | with | |
一度に適用可能な数 | 1つだけ | 0以上 |
classへの適用 | OK | NG |
それのみの適用 | OK | NG(extendsと一緒に) |
traitへの適用 | OK(一つの場合) | OK(2個目以降) |
なんか使い分けが中途半端なんだよね.
Functional
関数の override は出来るのか(意味があるかはともかく)
その際に元の関数が呼べるのか
?
Trait
何故 trait の拡張にのみ extends,mix-in には with としなかったのか
?
Stackable Modification
extends と with の順序はあるのか
上記表を参照
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 |