可能重複:
Java generics constraint require default constructor like C#約束在接口實現在java中
我想設置一個限制爲T類型,它必須有沒有參數的構造函數。在C#中它會像:
public interface Interface<T> where T : new() { }
是此功能在Java中可用?
可能重複:
Java generics constraint require default constructor like C#約束在接口實現在java中
我想設置一個限制爲T類型,它必須有沒有參數的構造函數。在C#中它會像:
public interface Interface<T> where T : new() { }
是此功能在Java中可用?
回答您的更新問題:只有類可以在Java中,T構造 - 是一種文字,沒有必要一直到成爲一個班級。在運行時使用反射,你可以檢查你的類是否是ParameterizedType有一個實際上是一個類的參數,並且它是否有一個空的構造函數。
您無法在Java中爲構造函數定義接口。除了類型變化之外,您還不能輸入任何其他約束來輸入參數。
只是說這個... = D – 2012-04-04 15:00:54
**誤解**這定義了泛型類型T的構造函數,而不是接口。 – Aliostad 2012-04-04 15:04:50
你不能在編譯時使用Java。我認爲你能做的最好是嘗試在運行時驗證這一點,通過使用反射來這樣做:
public static <T> boolean hasDefaultConstructor(Class<T> cls) {
Constructor[] constructors = cls.getConstructors();
for (Constructor constructor : constructors) {
if (constructor.getParameterTypes().length == 0) {
return true;
}
}
return false;
}
然後,你可以通過做調用此函數如下:
hasDefaultConstructor(String.class) => true;
hasDefaultConstructor(Integer.class) => false;
如果這個函數返回false,那麼你知道這個類沒有默認的構造函數,並且你可以拋出一個異常或任何適合你的應用程序的東西。
你可以做T,帶構造擴展一個類你想
public interface Interface<T extends Constructable>{}
public abstract class Constructable{
public Constructable(params..){
}
}
但繼承Constructable的類可能沒有默認構造函數(不帶參數)。 – ahanin 2012-04-04 15:26:28
當然它有,繼承時不能縮小訪問修飾符的範圍。如果父類有一個沒有參數的公共構造函數,那麼所有的子類都會有這個沒有參數的構造函數 – 2012-04-04 15:38:26
實際上,這是不正確的。它與訪問修飾符無關。這組構造函數對於每個特定的類都是唯一的。你必須在子類的每個構造函數中調用其中一個超構造函數,除非父類具有默認的構造函數。假設B是A的一個子類.A有一個默認構造函數。如果你在B中只定義了構造函數B(String),那麼你將不能用新的B()來實例化B。 – ahanin 2012-04-04 15:45:36
關於java接口的有趣問題...接口與構造函數.. :) – 2012-04-04 15:07:11