簡體   English   中英

靜態工廠方法中的泛型? (JAVA)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM