例えばこんな方法があると思います。
java
1interface InF<T extends InF<T>> {
2 abstract T add(T other);
3}
4
5class C1 implements InF<C1> {
6 @Override
7 public C1 add(C1 other) {
8 ...
9 }
10}
一般に派生クラスで初めて特定できる型をinterface上で宣言に用いたい場合(逆に言えばinterfaceの定義時点ではまだ具体的なクラスを特定したくない場合)、ジェネリクスの型引数を用いることができます。
上の例ではTは「Infの実装クラス」であることを意図しており、クラスを定義する際に
A implements Inf<A>
のようにちょっとトリッキーな定義にします。こうすることで「派生クラスAそれ自体の型を引数と戻り値の型となるようなメソッド」であることをinterface上で明示できます。ちなみにこのような手法は標準ライブラリーに実例があります。javaの全ての列挙型(enum)はEnum<E extends Enum<E>>
の派生クラスという扱いになっています。そのEnumクラスは型引数を用いてしかもちょっとややこしい感じの定義になっており、そうしている理由は質問者さんが本件でやりたいことと同じ動機のためと言えるでしょう。こうしておくと
public class Enum<E extends Enum<E>> implements Comparable<E> ... {
のように整合が取れた定義が行えます。もしこれを
public class Enum implements Comparable<Enum> ... {
と定義してしまうと、特定のenum型は他の全てのenum型と比較可能であるというような意味合い(不必要に型の範囲を拡張しすぎている)ことになります。Comparable<E>
としてやれば、各enum型が「自分自身の型(=E)とのみ比較できるクラス」であることが(直接的とは言えませんが)より自然に表現できるわけです。
本件には関係しませんが・・・
interface上の(実装がない)インスタンスメソッドはpublicにしかできません。いちいちpublicと指定しても間違いではないのですが、IDEによっては「そのpublic必要ないですよ?」と突っ込まれます。もちろん実装クラス側には明示的にpublicと書かねばなりません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。