2016-09-26 9 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

ますvoidメソッドから何かを返すことはできません。 – 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

でありません.NoSuchMethodExceptionは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

デポのメソッドの名前が異なっていることがわかります – 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 FileInputStreamは、オブジェクトに関する情報を保存することができることを、このコール

Item2.loadFromStream(oos); 

ノートと同じ

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

を呼び出して処理します。単に...あなたはこの情報に基づいてオブジェクトの作成を処理する必要がある。この場合(標準APIであなたのためにこれを行うクラスがあります。)

関連する問題