Java铸造问题

时间:2011-02-04 05:05:37

标签: java casting

我不明白为什么我需要在已经声明它们的类型时将成员变量转换为正确的类型。例如:

public class SomeClass extends SomethingElse {

  private Funky mFunkyVar;
  // a whole bunch of other variables and methods

  public void needToCast() {
    mFunkyVar = (Funky) new FunkySubClass();
  }

}

我是否犯了一些新手的错误,或者这确实是惯用的Java?在上面我假设FunkySubClass确实是Funky的子类。

7 个答案:

答案 0 :(得分:4)

实际上你不需要施展它!

  

我是否犯了一些新手

是的,但不要担心......在此之后你不会再这样做了;)

请参阅:

$cat Funky.java  
class Funky {
}
class FunkySubClass extends Funky { 
}
class SomethingElse { 
}
class SomeClass extends SomethingElse { 
    private Funky aFunkyVar;
    //...
    public void noNeedToCast() { 
        aFunkyVar = new FunkySubClass();
    }
}

$javac Funky.java 
$

没有编译错误。

修改

您可以投射基元和对象引用。

对于基元,如果要缩小值,则“必须”进行转换。

例如:

int i = 255;
byte b = ( byte ) i;

如果你不投,编译器会警告你,“嘿,你真的不想这样做”

...
byte b = i;
...
Funky.java:18: possible loss of precision
found   : int
required: byte
        byte d = i;

Casting就像告诉编译器:“嘿,不要担心,我知道我在做什么,好吗?”

当然,如果你施放,并且价值不合适,你会得到奇怪的结果:

int i = 2550;
byte b = ( byte ) i;
System.out.println( b );

打印:

-10 

更宽的类型比其他类型时,不需要强制转换

byte b = 255;
int i = b;// no cast needed

对于参考以类似的方式工作。

当你想要进入类层次结构(狭义)时,你需要强制转换,当你想要进入层次结构的上层时(例如你的样本中)你不需要强制转换。

所以如果我们有:

   java.lang.Object 
   |
   + -- Funky
        |
        +-- FunkySubclass

在这种情况下,当层次结构中的类型为upper(Object或Funky)时,您只需要强制转换。如果层次结构中的类型较低,则不必如此:

void other( Object o ) { 
    // Cast needed:
    Funky f = ( Funky ) o;
    FunkySubClass fsc = ( FunkySubClass ) o;
    FunkySubClass fscII = ( FunkySubClass ) f;
    // Cast not needed:
    Object fobj = f; 
    Object fscobj = fsc; 
    Funky fparent = fsc;
}

使用原语,JVM知道如何截断值,但参考号为。因此,如果目标类型的转换值,您将在运行时获得java.lang.ClassCastException。这是你必须付出的代价,当你告诉编译器“我知道我在做什么”而你却没有。

我希望这很清楚,不要混淆你。

:)

答案 1 :(得分:2)

如果FunkySubClass真的是Funky的子类,你就不需要演员。

如果你告诉我们你得到的错误,我们可以提供更多帮助。

答案 2 :(得分:1)

无需“(Funky)”,因为FunkySubClass Funky

答案 3 :(得分:1)

您不需要显式转换为基类。例如,实际上更不习惯于演员 - 一个常见的例子是:

List<String> somelist=new ArrayList<String>();

答案 4 :(得分:1)

如果FunkySubClass(命名不正确)实际上是Funky的父类,你只需要进行转换。将子类分配给父对象很好。

答案 5 :(得分:0)

new FunkySubClass()返回FunkySubClass类型的对象,而不是Funky。因此,您应该明确告诉Java将其视为Funky对象

正在转换的是右侧

答案 6 :(得分:0)

你不需要施放它。是什么让你觉得你做的?