Setelah diajari selama hari-hari C ++ saya tentang kejahatan operator cor gaya-C, saya senang pada awalnya menemukan bahwa di Java 5 java.lang.Class
telah memperoleh cast
metode.
Saya pikir akhirnya kami memiliki cara OO untuk menangani casting.
Ternyata Class.cast
tidak sama dengan static_cast
di C ++. Ini lebih seperti reinterpret_cast
. Ini tidak akan menghasilkan kesalahan kompilasi seperti yang diharapkan dan sebagai gantinya akan menunda waktu proses. Berikut adalah kasus pengujian sederhana untuk menunjukkan perilaku yang berbeda.
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 );
}
}
}
Jadi, inilah pertanyaan saya.
- Haruskah
Class.cast()
dibuang ke tanah Generik? Di sana ia memiliki beberapa kegunaan yang sah. - Haruskah kompiler menghasilkan kesalahan kompilasi saat
Class.cast()
digunakan dan kondisi ilegal dapat ditentukan pada waktu kompilasi? - Haruskah Java menyediakan operator cast sebagai konstruksi bahasa yang mirip dengan C ++?
Class.cast()
ketika kondisi ilegal dapat ditentukan pada waktu kompilasi. Dalam hal ini, semua orang kecuali Anda hanya menggunakan operator transmisi standar. (3) Java memang memiliki operator cast sebagai konstruksi bahasa. Ini tidak mirip dengan C ++. Itu karena banyak konstruksi bahasa Java tidak mirip dengan C ++. Terlepas dari kemiripan yang dangkal, Java dan C ++ sangat berbeda.