【问题标题】:Duplicate casting重复铸造
【发布时间】:2012-09-25 10:17:04
【问题描述】:

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

假设我有一个A类,还有一个Factory类,在工厂类中,我要创建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);

【问题讨论】:

    标签: java casting corba


    【解决方案1】:

    那个副本是完全多余的。您只需投射一次。

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

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

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

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

    【讨论】:

    • 我很困惑,因为我的同事问这个代码:org.omg.CORBA_2_5.ORB orb = ((org.omg.CORBA_2_5.ORB)org.omg.CORBA.ORB.init((String [])localObject2, localProperties));返回 (org.omg.CORBA_2_5.ORB)(org.omg.CORBA_2_5.ORB)(org.omg.CORBA_2_5.ORB)(org.omg.CORBA_2_5.ORB)(orb);您对此有何评论?
    • 我同意,乍一看,这似乎是多余的,但就是这样还是幕后有其他人?
    • 看来铸件是重复的。 Tks
    【解决方案2】:

    没有区别。

    int i = (int)(int)1 
    

    计算为 (int)1 到 1。

    完全多余。

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

    【讨论】:

      【解决方案3】:

      实际上,您是在对演员表进行演员表。

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

      基本上你可以在施法后重新施法——如果你问我,这毫无意义..

      或者更可笑的东西,例如:

      Integer integer1 = (Integer)(Object)thing.toString()
      

      【讨论】:

        【解决方案4】:

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

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

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

        此测试通过

        【讨论】:

          【解决方案5】:

          多余的

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

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

          【讨论】:

          • 是的,只是创造了更多的开销 - Integer int1 = (Integer)(Number)(Integer) (new Integer(10)); :-)
          【解决方案6】:

          只要这样想,

          你已经铸造了一个物体说

          (A)对象

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

          【讨论】:

            【解决方案7】:

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

            instance——Object 类型的表达式

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

            (A) (A) instance – 将 A 类型的表达式转换为 A 类型。

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

            final Object instance = get_A_Object();
            final A a = (A) instance;
            final A a0 = (A) a;
            

            【讨论】:

              猜你喜欢
              • 2011-03-26
              • 2021-06-14
              • 1970-01-01
              • 2015-12-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-05-12
              • 1970-01-01
              相关资源
              最近更新 更多