Nachdem ich während meiner C ++ - Tage über die Übel des Cast-Operators im C-Stil unterrichtet worden war, stellte ich zunächst erfreut fest, dass Java 5 java.lang.Class
eine cast
Methode erworben hatte.
Ich dachte, dass wir endlich eine OO-Art haben, mit Casting umzugehen.
Es stellt sich heraus, dass Class.cast
es nicht dasselbe ist wie static_cast
in C ++. Es ist eher so reinterpret_cast
. Es wird kein Kompilierungsfehler generiert, wo er erwartet wird, sondern auf die Laufzeit verschoben. Hier ist ein einfacher Testfall, um verschiedene Verhaltensweisen zu demonstrieren.
package test;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class TestCast
{
static final class Foo
{
}
static class Bar
{
}
static final class BarSubclass
extends Bar
{
}
@Test
public void test ( )
{
final Foo foo = new Foo( );
final Bar bar = new Bar( );
final BarSubclass bar_subclass = new BarSubclass( );
{
final Bar bar_ref = bar;
}
{
// Compilation error
final Bar bar_ref = foo;
}
{
// Compilation error
final Bar bar_ref = (Bar) foo;
}
try
{
// !!! Compiles fine, runtime exception
Bar.class.cast( foo );
}
catch ( final ClassCastException ex )
{
assertTrue( true );
}
{
final Bar bar_ref = bar_subclass;
}
try
{
// Compiles fine, runtime exception, equivalent of C++ dynamic_cast
final BarSubclass bar_subclass_ref = (BarSubclass) bar;
}
catch ( final ClassCastException ex )
{
assertTrue( true );
}
}
}
Das sind also meine Fragen.
- Sollte
Class.cast()
nach Generics Land verbannt werden? Dort hat es einige legitime Verwendungszwecke. - Sollten Compiler Kompilierungsfehler erzeugen, wenn sie
Class.cast()
verwendet werden und illegale Bedingungen zur Kompilierungszeit ermittelt werden können? - Sollte Java einen Cast-Operator als Sprachkonstrukt ähnlich wie C ++ bereitstellen?
Class.cast()
wenn zum Zeitpunkt der Kompilierung illegale Bedingungen festgestellt werden können. In diesem Fall verwenden alle außer Ihnen nur den Standard-Cast-Operator. (3) Java hat einen Cast-Operator als Sprachkonstrukt. Es ist nicht ähnlich wie C ++. Dies liegt daran, dass viele der Java-Sprachkonstrukte C ++ nicht ähnlich sind. Trotz der oberflächlichen Ähnlichkeiten sind Java und C ++ sehr unterschiedlich.