>>581
> そんじゃEiffel使えば良いんじゃないかと言う気もするが。
そうですね。
これからは提案ではなく参考意見としてレスします。

>>595
Eiffelのクラスは参照型と値型(expanded type)があります。

値型の INTEGER と REAL は
参照型の NUMERIC と COMPARABLE のサブクラスです。

NUMERICやCOMPARABLE に INTEGERやREAL を代入すると
参照型の INTEGERやREAL に変換されます。
型情報は失われません。
(参照型のオブジェクトは型情報を持っています)

値型の変数として宣言できるクラスとできないクラスがあります。
(クラス定義で指定します)

val: expanded FOO  -- 参照型のクラスを値型として宣言


また、制限ありの総称の場合
class FOO inherit COMPARABLE  -- FOOは参照型

class BAR[T ->COMPARABLE]

[T ->COMPARABLE] は仮総称パラメータで
COMPARABLEを継承しているクラスに制限するという意味。

a: BAR[INTEGER]
b: BAR[REAL]
c: BAR[FOO]

みたいに、参照型と値型のパラメータを一緒に制限することができます。