2012-04-04 109 views

回答

1

回答您的更新問題:只有類可以在Java中,T構造 - 是一種文字,沒有必要一直到成爲一個班級。在運行時使用反射,你可以檢查你的類是否是ParameterizedType有一個實際上是一個類的參數,並且它是否有一個空的構造函數。

5

您無法在Java中爲構造函數定義接口。除了類型變化之外,您還不能輸入任何其他約束來輸入參數。

+0

只是說這個... = D – 2012-04-04 15:00:54

+7

**誤解**這定義了泛型類型T的構造函數,而不是接口。 – Aliostad 2012-04-04 15:04:50

0

你不能在編譯時使用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,那麼你知道這個類沒有默認的構造函數,並且你可以拋出一個異常或任何適合你的應用程序的東西。

0

你可以做T,帶構造擴展一個類你想

public interface Interface<T extends Constructable>{} 

public abstract class Constructable{ 
    public Constructable(params..){ 
    } 
} 
+0

但繼承Constructable的類可能沒有默認構造函數(不帶參數)。 – ahanin 2012-04-04 15:26:28

+0

當然它有,繼承時不能縮小訪問修飾符的範圍。如果父類有一個沒有參數的公共構造函數,那麼所有的子類都會有這個沒有參數的構造函數 – 2012-04-04 15:38:26

+1

實際上,這是不正確的。它與訪問修飾符無關。這組構造函數對於每個特定的類都是唯一的。你必須在子類的每個構造函數中調用其中一個超構造函數,除非父類具有默認的構造函數。假設B是A的一個子類.A有一個默認構造函數。如果你在B中只定義了構造函數B(String),那麼你將不能用新的B()來實例化B。 – ahanin 2012-04-04 15:45:36