Explicit casting is required, and will succeed.
The reason why it's required is because it doesn't always succeed: a variable declared as A x
can refer to instances that aren't instanceof B
.
{
Object o = "Ha!";
String s = o; // DOESN'T COMPILE
// Type mismatch: cannot convert from Object to String
}
{
Object o = "Ha!";
String s = (String) o; // compiles fine, cast succeeds at run-time
}
{
Object o = Boolean.FALSE;
String s = (String) o; // compiles fine, throws ClassCastException at run-time
}
Whether or not a cast is required is determined only by the declared types of the variables involved, NOT by the types of the objects that they are referring to at run-time. This is true even if the references can be resolved at compile-time.
{
final Object o = "Ha!";
String s = o; // STILL doesn't compile!!!
}
Here, even though the final
variable o
will always refer to an instanceof String
, its declared type is still Object
, and therefore an explicit (String)
cast is still required to compile.