我有两个类似结构的类。出于某些原因,我必须有两个不同的课程。
class FooA {
Public String Name;
}
class FooB {
Public String Name;
}
我想将FooA转换为FooB对象。
FooA a = new FooA().setName("StackOverFlow is Great");
FooB b = (FooB)a;
目前,我正在进行深度复制,即创建实例并将值从一个分配给另一个。
FooB b = (FooB)a.getFooB();
我正在探索的另一个选择是使用Interface但我在类型转换中遇到了一些问题。
interface IA {
String Name;
}
class FooA implements IA {
Public String Name;
}
class FooB implements IA {
Public String Name;
}
FooA a = new FooA().setName("let's try this");
FooB b = ((FooB) (IA)a);
并且不能使用抽象类。
请求提出更好的方法。
由于 拉吉
答案 0 :(得分:3)
您无法将FooA投射到FooB。您可以执行以下操作
IA a = new FooA();
a. setName("let's try this")
IA b = (FooB) a
但它最终会在运行时创建Classcast异常。 因此,最好使用一个作为超级类和其他扩展早期的
答案 1 :(得分:2)
你应该从另一个类扩展一个类,然后你可以转换为更通用的类。另一个优点是,您可以根据需要覆盖特定行为。
答案 2 :(得分:2)
跳出来的唯一方法是映射器:
If lblSearch.Text = txtSearch.Text then
MsgBox(stackTemp.Pop)
stackA.Push(stackTemp.Pop(All Items))
Else
'Do Nothing
End If
你不能直接投射它们,因为它们不在一个继承树中。
答案 3 :(得分:1)
您无法将FooB
转换为class Ford extends Car { }
class Chevrolet extends Car { }
Ford ford = new Ford();
Chevrolet chevrolet = (Chevrolet) ford;
,因为它们不在同一继承树中。其中一个应该从另一个继承,以便施放它。
这是一个好的StackOverflow question,有一个很好的例子:
你不能。考虑稍微重命名:
FooA
看起来不对,对吧?
但是,您可以从单个界面继承。您**也不能将FooB
投射到interface Car
{
void Run();
}
class Ford extends Car { /* */ }
class Chevrolet extends Car { /* */ }
Car myCar = new Ford();
myCar.Run();
myCar = new Chevrolet();
myCar.Run();
,但您可以通过界面使用这两个类:
myImg.scaleAbsolute(documentWidth, documentHeight);