2013-04-15 43 views
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. 
    } 
... 
... 
... 
} 

,但似乎這是一個有點難看。你有更好的變種嗎?

+5

這就是'Comparable '這樣做的方式。你爲什麼不應該? –

+1

是的,可比較這是我在我的例子中指出的。但如果可能的話,我想要更好的方式 –

+3

我沒有看到問題。這是泛型的目的,指定一個類型。這就是你在做的。這並不難看。看看[這篇文章](http://www.ibm.com/developerworks/java/library/j-genericdao/index.html)以及他們如何使用Generics進行DAO。 –

回答

3

人們一直在問「這個」類型,主要是流利的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> 

由於This必須是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 
+0

謝謝,似乎這個答案是最接近我的問題。必須接受。 –

1

我會寫

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

沒少難看,但更明確的說T必須實現的接口。

+0

有一點明確的版本。謝謝! –

+1

但從類型安全的角度來看這是沒有意義的 – newacct

3

這很好,而且是最不醜陋的方式和最明確的方式來做到這一點。泛型僅用於確保類型安全性,即避免強制轉換。您的Updatable接口已經完全類型安全。那麼爲什麼改變一切?

我想指出的是,只有實現者的實例可以在 updateData(T t)方法中傳遞。

關鍵問題是:爲什麼你想這樣做?我沒有看到爲什麼需要這個接口本身的任何類型安全原因。

如果Office類要求其updateData方法的參數爲Office,那很好。但是這將是Office類的特定要求,因此Office應該負責(並且在您的代碼中)以使用適當的類型參數實現接口。