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

Java 编写向其实现者指出的通用接口的便捷方法,java,generics,Java,Generics,java中是否有一种编写通用接口的方法,可以更方便地向此类接口的实现者指出什么 例如,我编写了一个接口: public interface Updatable<T> { void updateData(T t); } 公共接口可更新{ 无效更新数据(T); } 我想指出的是,在updateData(T)方法中只能传递实现器的实例 所以,我必须这样写: public class Office implements Updatable<Office> { @Ov

java中是否有一种编写通用接口的方法,可以更方便地向此类接口的实现者指出什么

例如,我编写了一个接口:

public interface Updatable<T> {
    void updateData(T t);
}
公共接口可更新{
无效更新数据(T);
}
我想指出的是,在updateData(T)方法中只能传递实现器的实例

所以,我必须这样写:

public class Office implements Updatable<Office> {

@Override
    public void updateData(Office office) {
        //To change body of implemented methods use File | Settings | File Templates.
    }
...
...
...
}
公共类Office实现可更新{
@凌驾
公共作废更新数据(办公室){
//要更改已实现方法的主体,请使用文件|设置|文件模板。
}
...
...
...
}
但看起来有点难看。你有更好的变体吗?

我会写

public interface Updatable<T extends Updatable<?>> {
    void updateData(T t);
}

public interface updateable人们一直要求使用“This”类型,主要用于fluent API。它可能永远也做不到。但是我认为建立一个约定是可以的——将类型变量命名为
This
,以表示
This
的类型。所以读者看到这个
,就知道它应该是什么;不太可能滥用

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

// any Foo implementing Updatable must supply This=Foo

public class Office implements Updatable<Office> 
我认为没有必要,也不应该这样做。
这个
的命名约定已经足够好了

这种限制也不够严格,无法防止滥用。比如说

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
公共接口Foo
公共类Foo1实现Foo//良好的预期用途
公共类Foo2实现Foo//编译!但并非有意

这很好,是最不丑陋、最清晰的方法

泛型仅用于确保类型安全,即避免类型转换。您的
可更新的
接口已经完全是类型安全的了。那为什么要改变什么呢

我想指出的是,只能传入实现者的实例 更新数据(T)方法

关键问题是:你为什么要这么做?从接口本身来看,我看不出任何类型安全的原因,为什么需要这样做


如果
Office
类要求其
updateData
方法的参数为
Office
,则可以。但是这是
Office
类特有的要求,因此
Office
应该负责(并且在您的代码中)使用适当的类型参数实现接口。

这就是
compariable
的工作方式。为什么不呢?是的,就像我在例子中指出的那样。但如果可能的话,我想要更好的方法。我不认为有问题。这是泛型的目的,用于指定类型。这就是你正在做的。这并不难看。检查并了解他们如何为DAO使用泛型。相关:。一个显式版本。谢谢但是,从类型安全的角度来看,做出这种限制是没有意义的。谢谢,似乎这个答案最接近我的问题。我们必须接受。
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