クラスとは何か、型とは何か

とりあえず最初に突っ込み入れちゃいますね。

これが、クラスとは何か - SiroKuro Pageのような混乱につながっているのだと思う。

クラスとは何かを集合論から考えなおす

これって「混乱している」のは自分なのか、id:nowokay さんなのか、それとも第三者なのかが曖昧でよく分かりませんが、とりあえず自分は混乱したという自覚はありませんでした。そもそも、その記事は

【クラス】っていう単語を安直に使うと、

  1. ソースコードの記述に着目した『クラス定義』
  2. Java のデータ型に着目した『クラス型』
  3. オブジェクト指向に着目した、概念としての『クラス』またはそれを扱う『java.lang.Class』
  4. ソースコードの記述に着目した、型名記述子として用いる『クラス名』

という4種類の意味が推測できてしまい、その違いがシビアに影響する文脈においては困ってしまうのではないか。

ということを書きたかったがために自分用に整理したメモです。以上4点は可能ならば混同して扱うべきではないのですが、それならば

クラスは型である

と単に言われたときに、「型について語っている文面なんだから、これはクラス型のことを言っているんだよな」 って考えるのならば問題は無い*1です。
合格点は「(型名記述子として用いている)クラス(の名前が指し示す対象)は型である」です。これは発言したひとの意図を100%汲む文脈になっていると思います。たぶん。
しかし、誤って 「クラスって言っているんだからオブジェクト指向の概念としてのクラスだよな」 「クラスって言っているんだからクラス定義としてのクラスだよな」 って考えてしまうと、後々困ってしまうよな、ということを自分は考えていました。


で、話は戻して、クラスとは何かを集合論から考えなおす について。
指摘するならば、『IntegerクラスとInteger型』や『StringクラスとString型』のように、『オブジェクト指向の概念としてのクラス』と『クラス型』を混同している点が気になるところ。どちらも省略すれば「String」「Integer」になってしまうので、今回のように混同すると困ってしまうような文脈においてはこれはまずい。「StringクラスとString型は対応関係にあるが、両者は別々の存在・概念である」にすると良いのではないだろうか。
もうひとつ。『クラス』と『クラス型』が混同されている中に、さらにクラスとメタクラスの混乱も入っているのでややこしさが倍増している。

それと、なんだかとばっちりを受けたような形で、StringやIntegerも階層0の要素のようになってしまった。

クラスとは何かを集合論から考えなおす

そう。クラスとクラス型が混同しやすいという話だったはずなのに、クラスとメタクラスの混乱も入って、まさにとばっちりを受けた形になってしまっているのです。


ということで結論。

階層0のクラスを「クラス」、階層2のクラスを「クラス型」と呼び、階層1のクラスは「クラス名」としているということになるのかな

クラスとは何かを集合論から考えなおす

はい。「クラス」「クラス型」「クラス名」は、こちらの意図した通りなのですが、上述の通り、自分は『不要な階層構造』は一切用いていないので、その意味においては違います、といった感じです。
そもそも『クラス』『クラス定義』『クラス型』『クラス名』には、関連性こそあるものの、別々の存在であり別々の概念であるわけですから、同じ階層構造の中に閉じ込められるはずがないのです。

*1:けど自明だから意味も無いかも