Why the instance of A can cast to List but can not cast to String?
class A{}
...
A a = new A();
List list = (List)a; //pass
String s = (String)a; //compile error
Quoting JLS:
It is a compile-time error if, for any two classes (not interfaces) Vi and Vj, Vi is not a subclass of Vj or vice versa.
String
and A
are unrelated classes, so it is a compile-time error. List
is an interface, so that does not cause the same error.
Note that your assertion
the instance of A can cast to List
Is not quite correct: A
cannot be cast to List
; it is just a runtime failure, not a compile-time failure.
The compiler, according to the specification, only takes the declared type of a
into account when it does these checks for casts.
So, you write:
A a = new A();
But the compiler only considers
A a; // = <something>;
So it knows that a
cannot be a String
, since a class can have only one superclass (no multiple inheritance), there can't be a subclass of class A
that is also a String.
But for interfaces this isn't true. So while we know that class A
doesn't implement List
, there could be a class B
defined like this:
class B extends A implements List {}
And since the compiler only considers the declared type, it must assumes that it is also possible the you assigned new B()
to a
.
So, because a subclass of A
could implement the interface List
, the compiler can't assume that the cast to List
always fails.
Of course the cast will fail in practice though - at runtime. But not at compile time.
A class in Java can only be cast to one of its super types, or one of the interfaces on one of its super types.
In your case, class A
is not a subclass of String
. Therefore A
cannot be cast to a String
. Also, String
is a final class, so you cannot write a class A
that could be cast to a String
.
Java already recognizes the need to easily display classes as Strings, especially for debugging / logging purposes. To satisfy this need, the Object
class comes with a toString()
method. Since all Java classes extend from the Object
class, all Java classes contain an implementation of the toString()
method.
It is important to remember that the existence of a toString()
method doesn't mean that A
is a String, rather it means that you can get a String from A
that somewhat describes the A
instance. If you find that the provided description is lacking for your purposes, you may override A
's toString()
method an return a better description, like so
@Override
public String toString() {
return "my better description";
}
As the override is written in Java, you can also include any variable or other item that you can eventually turn into a String (which since all Objects have toString()
includes nearly anything).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With