2016-09-26 110 views
-1
public class Depot extends Item2 
{ 
} 

public class Ship extends Item2 
{ 
} 

abstract public class Item2 
{ 
    public static void loadFromStream(FileInputStream oos) throws IOException 
    { 
     return new whatToWriteHereToGetDEPOTorSHIP? 
    } 
} 

Depot o1 = Depot.loadFromStream(oos); 
Ship o2 = Ship.loadFromStream(oos); 

代碼中的問題:如何從靜態方法創建Ship或Depot實例?取決於倉庫。或運送。Java,靜態方法可以實例化一個被調用的對象嗎?

+2

您只需不能從無效方法返回一些東西。 – progyammer

+1

爲什麼你在使用'Item2'?靜態方法不能被繼承。只需在兩個類中聲明該方法,然後編寫不同的實現。 – resueman

+1

@resueman靜態方法_are_被繼承,但它們不被覆蓋。 –

回答

1

你可以這樣做......

package main; 

import java.io.FileInputStream; 
import java.io.IOException; 

public class Exam { 
    public static void main(String[] args) throws Throwable { 

     Depot depot = (Depot)Depot.loadFromStream(null, Depot.class); 
     System.out.println(depot); 
     Ship ship = (Ship)Ship.loadFromStream(null, Ship.class); 
     System.out.println(ship); 

    } 
} 

class Depot extends Item2 
{ 
} 

class Ship extends Item2 
{ 
} 

abstract class Item2 
{ 
    public static Object loadFromStream(FileInputStream oos, Class c) throws IOException, Throwable 
    { 
     return c.newInstance(); 
    } 
} 
+1

這只是忽略了'FileInputStream'。我不認爲這是他們想要的。 – resueman

+1

我也這麼認爲。但線索的沒有更多 – lie

+0

在newInstance() –

3
abstract public class Item2 { 
    public static Item2 loadFromStream(FileInputStream oos) throws IOException { 
     try (ObjectInputStream ois = new ObjectInputStream(oos)) { 
      return (Item2) ois.readObject(); 
     } 
    } 
} 

之後,您需要施放。如果你想你所描述的靜態調用,在子類中創建它們:

public class Depot extends Item2 { 
    static Depot loadDepotFromStream(FileInputStream oos) { 
     return (Depot)loadFromStream(oos); 
    } 
} 
+0

這一行「return(Depot)loadFromStream(oos);」不會導致堆棧過度?它不應該調用它自己,而不是Item2.loadFromStream? –

+1

如果你看起來很近,你會發現Depot中的方法命名不同 – Friso

3

你可以這樣做:

public class Depot extends Item2 
{ 
    public static Depot loadFromStream(FileInputStream oos) throws IOException 
    { 
     return Item2.loadFromStream(oos, Depot::new); 
    } 
} 

public class Ship extends Item2 
{ 
    // ... similar here 
} 

abstract public class Item2 
{ 
    protected static <T extends Item2> T // notice the "protected" 
      loadFromStream(FileInputStream oos, Supplier<T> cons) throws IOException 
    { 
     T t = cons.get() 
     // ...common logic... 
     return t; 
    } 
} 
+1

'loadFromStream()'應該做什麼? –

+1

@GyroGearless這不是OP的問題嗎?我會想象它會執行一些反序列化操作。 –

2

沒有這樣做沒有通過關於類的一些信息,以便方式創建爲參數。

編譯器處理下列2調用相同

Depot.loadFromStream(oos); 
Ship.loadFromStream(oos); 

,因爲這調用

Item2.loadFromStream(oos); 

注意,FileInputStream可以存儲關於對象的信息。在這種情況下,你需要根據此信息來處理對象的創建...(有標準的API在這樣做了,你的類。)

相關問題