RE: クラス

もし、一番下の派生クラスでtoStringを上書きしてたら?一回toStringする事を前提にしてたら、言語上の動きと整合性取れなくなる可能性すらある。言語のなかの処理なのに言語上でどう動くかを考慮しないといけなくなる。

http://nazakki.blogspot.com/2009/03/blog-post_815.html

Java ではメソッドそれ自体に型は無いけど、もし型があるとしたら-Java では同じ型のメソッドを派生クラスで定義するとオーバーライドされる。オーバーライドによって実装は変更されるが、型は変更されない。そもそも型を変更するような上書きを行うプログラムって作れるのかな。

class SuperClass {
	public Object foo() {
		return null;
	}
}
class SubClass extends SuperClass {
	public String foo() {
		return null;
	}
}

作れた。逆はダメ。String extends Object だから特に SuperClass.foo の戻り値型は変更されてない。

ML風レコードを使って説明すると、例えば次の Java クラスは、

class Foo {
    String toString() {
        // ...
    }
}
class Bar {
    Object getValue() {
        // ...
    }
}

下のようなレコード型の表記として表すことができる。*1

Foo = { toString: Foo -> String, ... }
Bar = { toString: Bar -> String, getValue: Bar -> String, ... }

この情報と、Foo extends Object, Bar extends Foo の情報を元にインタフェイスへと変換すると下のようになる。

interface Foo {
    String toString();
}
interface Bar extends Foo {
    Object getValue();
}

これが Java におけるクラス型を考えたときに、余分な構成要素の最も少ない表記であると考えられる。

本題

String Interfaceだとしたら、Stringクラス型の中身は永遠に取れないかもしれない。型指定してるのに、中身がおかしいという実行時エラーが出る可能があるなんてのはあり得ないから、型指定が無い言語なら良いけど、型指定がある言語だと厳しい。

http://nazakki.blogspot.com/2009/03/blog-post_815.html

「中身」という言葉が曖昧で困るんだけど、これは次のうちのどの指摘に該当するのだろうか……

  1. 型から実装は取得できるはずがない
  2. 型情報は処理系が握っているので、ユーザが扱うことは出来ない
  3. クラス型の型情報には、メソッドに関する型情報が含まれているはずがない
  4. 静的型付けしていても実行時型エラーが出てくる以上、クラス型の中にあるメソッドの型情報は取れていないのだろう

それぞれ次のように補足できる。

  1. もちろん型から実装は取得できない
  2. 処理系が型を処理する以上、ユーザが直接扱えずとも問題は無い
  3. 含まれていて取得も自由であると考えたほうが扱いやすいだろう
  4. キャストや、コンパイル後のクラスファイル変更、リフレクションなどで型エラーを出すことが可能

……nagaShima さんが何を指摘しようとしているのかが、いまいち読み取れなくて困る(´・ω・`)

*1:ただしレコードに継承は無いから、Foo extends Object, Bar extends Foo だという情報は表記できていないんだけど