[英]Generics in static factory methods? (Java)
我有一個作業,要求我使用工廠模式來實現不變的數據結構,但是問題是抽象類是泛型的,而讓靜態方法引用泛型類型給我帶來了問題。 我的作業要求我使用靜態方法,因此我開始感到恐慌。 任何幫助/建議嗎? EDIT添加了一些示例代碼,這是教授給我們簽名的方法之一的規范:
ExampleClass.method1:ExampleClass,T-> ExampleClass
ExampleClass.method2:ExampleClass-> T
public abstract class ExampleClass<T>{
//static method creates a new subclass of Example ("Push" method)
public static Class method1(T x, ExampleClass c){
return new method1(x, f);
}
//Supposed to return an object type T ("pop" method)
public static T method2(ExampleClass c){
return c.method2Dynamic();
}
我喜歡的兩種方法都給我帶來了日食方面的問題。
我不知道您實際上想做什么,但是讓我們假設問題是您只是在尋找正確的語法:
public class ExampleClass<T> {
public static <T> Class<T> method1(T x, ExampleClass<T> c) {
return c.method3(x);
}
public static <T> T method2(ExampleClass<T> c) {
return c.method2Dynamic();
}
private Class<T> method3(T x) {
return null;
}
private T method2Dynamic() {
return null;
}
}
請參閱Java教程以獲取有關通用方法(與通用類相對)的幫助。
到目前為止,從您的描述來看,靜態方法與實例方法的問題不應該在這里發揮作用。
如果您有通用類,則不能在靜態方法中使用類型參數,因為它們在那里沒有意義。 例如,考慮ArrayList<T>
。 您可以創建ArrayList<String> stingList = new ArrayList<String>()
和ArrayList<Integer> integerList = new ArrayList<Integer>
。 因此,現在您必須擁有每個具有自己的參數類型的ArrayList實例,以及可以利用該參數類型(如get
實例方法。 但是靜態方法屬於該類而不是實例,因此,當您調用靜態方法時,可以像ArrayList.staticMethod()
不是stringList.staticMethod()
或integerList.staticMethod()
一樣調用它(您也可以這樣做,但是它不會確實沒有意義,因為靜態方法無法訪問實例變量,因此它的作用與在類上調用它的作用完全相同。 但是,當您在類上調用它時,該類只是ArrayList,沒有任何類型參數,因為類型參數僅由實例使用。
但是,您可以使方法具有自己的類型參數,而這些類型參數與類的類型參數無關,如Thomas在其答案中所示。 因此,您可以隨后調用諸如ExampleClass.<String> staticMethod()
; 請注意,ExampleClass在這里沒有類型參數,但是方法確實有它。 (如果編譯器可以從使用的參數或返回類型中推斷出<String>
,則可以在方法調用中省略<String>
: String s = ExampleClass.method2(new ExampleSubclass<String>())
;它通常做得很好推斷它的工作)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.