2

我的同事问我一个我自己找不到最终答案的问题,这个问题是关于对象铸造的。

假设我有一个 A 类和一个工厂类,在工厂类中,我想创建 A 实例:

Public class Factory {

    public A createA1() {
       Object instance = get_A_Object();
       //Single casting
       return (A) instance;
    }

     public A createA2() {
       Object instance = get_A_Object();
       // Duplicate casting or more
       return (A) (A) instance;
    }
}

我的问题是:

方法 createA1() 中的单次转换与方法 createA2() 中的重复转换有什么区别?他们总是得到相同的结果吗?

编辑:

为了澄清,我的同事问我这行代码:

org.omg.CORBA_2_5.ORB orb = ((org.omg.CORBA_2_5.ORB)org.omg.CORBA.ORB.init((String[])localObject2, localProperties)); 
return (org.omg.CORBA_2_5.ORB)(org.omg.CORBA_2_5.ORB)(org.omg.CORBA_2_5.ORB)(org.omg.CO‌​RBA_2_5.ORB)(orb);
4

7 回答 7

5

该副本是完全多余的。您只需施放一次。

这是一个练习。如果您在 IDE 中加载它,并逐个删除强制转换,它会在什么时候开始抱怨您的类型?

实际上,在您修改后的问题中,您根本不需要投!

org.omg.CORBA_2_5.ORB orb = ((org.omg.CORBA_2_5.ORB)org.omg.CORBA.ORB.init((String[])localObject2, localProperties));

您已orb在作业中声明了 ' 类型。

于 2012-09-25T10:19:07.380 回答
2

没有不同。

int i = (int)(int)1 

计算为 (int)1 到 1。

完全多余。

编辑: 与问题无关,但是..您不需要强制转换。你的工厂至少应该返回一个接口。看起来像代码气味。

于 2012-09-25T10:19:49.843 回答
1

本质上,您正在对演员表进行演员表。

Object obj = (Object)(Integer)thing.getObeject()

基本上你可以在铸造后重新铸造 - 如果你问我,那是毫无意义的..

甚至更可笑的东西,例如:

Integer integer1 = (Integer)(Object)thing.toString()
于 2012-09-25T10:19:50.163 回答
1

从功能上看,它看起来是一样的,所以我会说双重铸造是多余的。

它可能是字节码深处的东西,但编译器非常高效,所以我认为不会有任何东西。下面的测试表明它们在功能上是相同的

@Test
public void testCasting {

    Object obj = new String("abc");

    String s1 = (String) obj;
    String s2 = (String)(String)  obj;

    assertEquals("abc", s1);
    assertEquals("abc", s2);
    assertEquals(s1, s2);
}

此测试通过

于 2012-09-25T10:20:28.007 回答
1

它的多余

        Number num = (Number)(Number) (new Integer(10));

将整数转换为 Number 两次。没有区别

于 2012-09-25T10:21:54.190 回答
1

只要这样想,

你已经铸造了一个物体说

(一)对象

现在 obj 变成了 A 类类型,我们不需要再次强制转换,即使我们这样做也不会造成任何伤害,它会浪费这个过程。

于 2012-09-25T10:47:52.033 回答
1

从 Java 语言规范的角度来看,它是这样的:

instance– 类型的表达式Object

(A) instance– 类型的表达式A

(A) (A) instance– 将 type 的表达式转换A为 type A

另一种表达方式是与以下代码进行比较:

final Object instance = get_A_Object();
final A a = (A) instance;
final A a0 = (A) a;
于 2012-09-25T11:14:21.167 回答