接口转换了两个类

时间:2015-08-14 06:36:12

标签: java android

我有两个类似结构的类。出于某些原因,我必须有两个不同的课程。

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);

并且不能使用抽象类。

请求提出更好的方法。

由于 拉吉

4 个答案:

答案 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);