在Java中,静态方法能否实例化调用它的对象?
代码中的问题:如何从静态方法创建Ship或Depot的实例?视车辆段而定。或者船在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
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();
}
}