Java 编写向其实现者指出的通用接口的便捷方法
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
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