编写指向其实现者的通用接口的便捷方式

Ole*_*_DJ 5 java generics

java中是否有一种编写通用接口的方法,以更方便的方式指出这种接口的实现者?

例如我写的界面:

public interface Updatable<T> {
    void updateData(T t);
}
Run Code Online (Sandbox Code Playgroud)

我想指出只有实现者的实例可以在updateData(T t)方法中传递.

所以,我必须写这样的东西:

public class Office implements Updatable<Office> {

@Override
    public void updateData(Office office) {
        //To change body of implemented methods use File | Settings | File Templates.
    }
...
...
...
}
Run Code Online (Sandbox Code Playgroud)

但似乎有点难看.你有更好的变种吗?

Zho*_*gYu 3

人们一直在寻求“This”类型,主要是为了流畅的 API。可能永远也成不了了 但我认为建立一个约定就可以了 - 命名类型变量This来表示 的类型this。这样读者就可以清楚地看到This并知道它应该是什么;滥用的可能性不大

public interface Updatable<This> {
    void updateData(This t);
}

// any Foo implementing Updatable must supply This=Foo

public class Office implements Updatable<Office> 
Run Code Online (Sandbox Code Playgroud)

由于This必须 是 的子类型Updatable<This>,人们经常表达这种约束

public interface Updatable<This extends Updatable<This>> 
Run Code Online (Sandbox Code Playgroud)

我认为没有必要,也不应该这样做。的命名约定This已经足够好了。

该限制也不够严格,不足以防止滥用。例如

public interface Foo<T extends Foo<T>>

public class Foo1 implements Foo<Foo1>  // good, intended use

public class Foo2 implements Foo<Foo1>  // compiles! but not intended
Run Code Online (Sandbox Code Playgroud)