Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将基础对象转换为扩展基础对象的对象_Java - Fatal编程技术网

Java 将基础对象转换为扩展基础对象的对象

Java 将基础对象转换为扩展基础对象的对象,java,Java,我有一个非唯一名称的自动生成类。由于无法更改该类或生成该类的文件,我将其放入自己的包中。这导致我需要在任何时候声明或铸造该对象时键入整个包 我的解决方案是创建一个子类,如下所示 public UniqueName extends BaseClass { // This class is empty and intended to be used as an alias. } 不幸的是,我遇到了另一个问题,序列化和反序列化只能在基类上完成 我想知道的是,是否有办法将基类转换为扩展它的别名

我有一个非唯一名称的自动生成类。由于无法更改该类或生成该类的文件,我将其放入自己的包中。这导致我需要在任何时候声明或铸造该对象时键入整个包

我的解决方案是创建一个子类,如下所示

public UniqueName extends BaseClass
{
   // This class is empty and intended to be used as an alias. 
}
不幸的是,我遇到了另一个问题,序列化和反序列化只能在基类上完成


我想知道的是,是否有办法将基类转换为扩展它的别名类?我曾尝试将基类强制转换为alias类,但从eclipse中收到了几个错误

我理解,出于某种原因,基类是不可修改的,您希望最终得到一个更“有用”的基类版本

不要扩展基类,而是在UniqueName上委托给它:

public BaseClass{
    public void usefulMethod() { ... }

    public void lessUsefulMethod() { ... }
}

public UniqueName 
{
    private BaseClass baseClass;

    public UniqueName(BaseClass baseClass){ this.baseClass = baseClass; } 

    public void usefulMethod() { return baseClass.usefulMethod(); }

    public void moreUsefulMethod(){
       ...
       baseClass.lessUsefulMethod();
       ... 
    }
}
使用以基类为参数的构造函数创建UniqueName实例,而不是从基类到UniqueName的类型转换

如果需要与基类保持UniqueName的“is-a”关系,可以这样做。但是不要忘记重写每个方法并将其委托给基类实例


注意:如果您在序列化/反序列化中遇到对象替换问题,ObjectInputStream和ObjectOutputStream类具有replaceObject和resolveObject方法,这允许我们替换序列化中的对象类型

你可以随时使用工厂;“包丑陋”将只出现在一个地方。你说的工厂是什么意思?@fge或者,将类与引用它的代码放在同一个包中,并对共享相同基名称的其他类使用完全限定名,如果它们恰好有较短的完全限定名。@JME,那么您最终将使用类似于
MyClass.getInstanceOfNonUniqueClass().doSomething()
的调用。或者,您可以创建一个包装类,其实例包含另一个类的实例,然后您可以执行
instanceofWrapperClass.getInnerObject()
或以您想要的方式命名。(第一个版本对于一次性对象可能更有用,而后者对于更持久的对象可能更好,但我没有足够的经验来说明是否确实如此。)我一直在阅读Wiki和几个堆栈溢出线程,以及通过google找到的其他文档。我不明白在这种情况下创建工厂方法将如何帮助我,似乎我正在子类中完全重建原始类,这似乎完全违背了子类的目的。