5

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

例如我写了接口:

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

我想指出,只有实现者的实例才能在 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.
    }
...
...
...
}

不过好像有点丑。你有更好的变种吗?

4

3 回答 3

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> 

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

public interface Updatable<This extends Updatable<This>> 

我认为没有必要,也不应该这样做。的命名约定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
于 2013-04-15T20:15:30.633 回答
3

这很好,是最不难看和最清晰的方法。

泛型只是为了确保类型安全,即避免强制转换。您的Updatable界面已经是完全类型安全的。那么为什么要改变任何东西呢?

我想指出,只有实现者的实例才能在 updateData(T t) 方法中传递。

关键问题是:你为什么要这样做?从界面本身来看,我没有看到任何类型安全的原因,为什么需要这样做。

如果Office该类要求其updateData方法的参数是Office,那很好。但这将是特定于Office类的要求,因此Office应该负责(并且在您的代码中)使用适当的类型参数实现接口。

于 2013-04-15T20:54:40.287 回答
1

我会写

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

同样丑陋,但更明确的是T必须实现接口。

于 2013-04-15T18:42:06.090 回答