在Java中,静态方法能否实例化调用它的对象?

在Java中,静态方法能否实例化调用它的对象?,java,Java,代码中的问题:如何从静态方法创建Ship或Depot的实例?视车辆段而定。或者船 public class Depot extends Item2 { } public class Ship extends Item2 { } abstract public class Item2 { public static void loadFromStream(FileInputStream oos) throws IOException { return new w

代码中的问题:如何从静态方法创建Ship或Depot的实例?视车辆段而定。或者船

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);
在那之后,你需要投。如果需要描述的静态调用,请在子类中创建它们:

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);
    }
}
公共类仓库扩展项2
{
公共静态仓库loadFromStream(FileInputStream oos)引发IOException
{
返回项目2.loadFromStream(oos,仓库::新建);
}
}
公共级船舶扩展项目2
{
//……这里也差不多
}
抽象公共类项2
{
受保护的静态T//注意“受保护的”
loadFromStream(FileInputStream oos,供应商cons)引发IOException
{
T=cons.get()
//…普通逻辑。。。
返回t;
}
}

如果不将要创建的类的一些信息作为参数传递,则无法执行此操作

编译器处理以下两个相同的调用

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;
    }
}
这叫什么

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

请注意,
FileInputStream
可以存储有关对象的信息。在这种情况下,您需要根据此信息处理对象创建。。。(标准API中有一些类为您这样做。)

您可以这样做

Item2.loadFromStream(oos);

您根本无法从void方法返回某些内容。为什么要为
Item2
而烦恼?无法继承静态方法。只需在两个类中声明该方法,并编写不同的实现。@resueman静态方法是继承的,但不会被重写。
loadFromStream()
应该做什么?@GyroGearless这不是OP的问题吗?我想象它做了一些反序列化操作。这只是忽略了
FileInputStream
。我认为那不是他们想要的。我也这么认为。但是线索不再是java.lang.NoSuchMethodException在newInstance()触发所有其他解决方案似乎也不错,但这更好这行“return(Depot)loadFromStream(oos);”不会导致堆栈溢出吗?它不是应该调用自身而不是Item2.loadFromStream吗?如果仔细观察,您会发现Depot中的方法的名称不同
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();
    }
}