2016-09-26 70 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在这样做了,你的类。)

相关问题