Javaのインターフェイスでmethodを一つしか持たないものはSAMインターフェイスと呼ばれ、ラムダ式で置き換えられるようになっている。それをSAM変換と呼ぶ、ということですが、分かりません。"(-""-)"
interfaceでH_Bucketを定義します。
object式でクラスを実装。出来るんですね。createBucket()でクラスのインスタンスを作れる。
テストは同じです。
StudentクラスのobjectをPersonクラスのobjectとして扱うことができる。ということですかね。aPersonは元々はStudentのobjectなのでStudentのobjectとして扱える。
aPersonはIntとしては扱えません。エラーが起きるところですが、as?を使えばnullを返してくれます。
objがStringだったらobjをキャストする必要がないのでobj.lengthと書ける。当然といえば当然。それ以外であればnullを返しますが、printlnするとnullという文字列でした。だったらそれのlengthは出来る?getLen(12345).toString()とは書けましたが、結果は同じnullでした。.lengthとは書けないようです。純粋な文字列ではない?"(-""-)"
getLenは文字列であれば、Intを返すので文字列と判断できます。nullであればそれ以外です。
BucketをH_をつけてだぶらないように定義。interfaceはクラスのプロトタイプみたいなもんですかね?
H_Bucketで定義したものは全てoverrideをつけて、実装します。すべて実装しないうちはエラー表示されます。クラス名にアンダーの赤波が付きます。
b1は容量7、b2は4です。b1を一杯にして、b2へ移すと、b1は3残り、b2は4入ってます。
objectを使って、classのようなものをmainに閉じ込めてました。この宣言部分をmainの外に出してもエラーです。VBとかならmainの外で宣言すればglobalなものになりそうですが、そうではないようですね。このobjectの使い方をobject式と呼んでるようです。
今までの知識では、classとしてmainの外で宣言するのが、普通のやり方でしょう。と思います。上のようにです。
上の図はKotlinのマニュアルからです。クラスに似ているがそれ自体では使えない、abstractと似ているが違うとこもあるようです。まあその程度で止めておきます。マニュアルにはもっと突っ込んだサンプルもあります。「はじめてのAndroidプログラミング」の例があまりにも簡単だったので。
class Dogは前の例で定義しているので、使える、ことに注意。多分ですが、mainは各々が独立ですので、ダブりは無い。と言うことはmainの中にclassを持ってくれば同じものでも定義できる、と思います。実験したら駄目でした。classはmainの外に置くのが普通のようです。
class HouseCatとclass Catの継承の仕方に注意ですね。親classにあるvar nameについては派生クラスではvar付かない。ことに注意ですかね。
class Dogとclass Catを例題にしてます。気づいたのが、classはmainの外でもOK 。classを定義するとき、クラスの名前の直後()があるかないかで多少違いがある。例えば val adog =Dog("Pochi")のように一般的に描く場合は、直後に()を書くタイプでないといけないようです。init{}でイニシャライザを書けます。
注目はdoLambdaです。それを少し変形したのがdoLambdaSampleです。簡単に説明すると、関数自体では処理が決まらない。呼び出すときに処理は決まる。この場合はこうすることが適当かは問題あるかもしれませんが。この辺が難しい。
「はじめてのAndroidプログラミング」の説明では、関数型の引数のメリットは、実行時に処理の内容を決定できるということです。上と同じことですかね?
「はじめてのAndroidプログラミング」によれば、{}の中をラムダ式と言い、この時の変数を関数型というようです。var、valどちらでも良いようですが。変数の定義は型を宣言することもできるので、この場合もできるようです。例えばvar minus:(Int, Int) -> Int = {x, y -> x - y}とも書けるようです。定義自体は変数の方かラムダ式の方か、どちらかにあれば良いようです。暗黙の引数itを使う場合は、変数の定義に引数の型と関数の型を書いてるようです。
結果は満足できないものになりました。Cygwin64はGnomeというものが動いたんですが、日本語入力が出来ませんでしたし、Ubuntuは結構前にはやってみることができたんですが、今回はWindowを出すこともできませんでした。両方が少し混同したかもしれません。
でも、多分ですが、削除は出来たんで、悪影響はないと思います、と祈ります。最悪の事態はクリーンインストールをすることです。これに関しては多分できるでしょう。
本来の目標はAndroidプログラミングなので、戻ります。幾らかプログラムみたいな関数の書き方です。多分ですが、returnは省略できると思います。最後の値が、returnされるのが今風なんで。
for( i in 1..4)はOKですが、for(i in 4..1)はエラーにはなりませんが、無視されるようです。"(-""-)"なんか反応してほしい。書き方が別にありますとか?使えませんとか?
4行目のforがエラーになります。どうしてなんですかね?もしかしたら別の書き方がある、ということですかね。
確かに、別の書き方があるようです。どっちでも動くようには出来ないんですかね?