मेरे C ++ दिनों के दौरान सिखाई जाने वाली C- स्टाइल कास्ट ऑपरेटर की बुराइयों के बारे में मुझे यह जानकर पहली बार में प्रसन्नता हुई कि Java 5 java.lang.Class
में एक cast
विधि प्राप्त हुई थी ।
मैंने सोचा कि आखिरकार हमारे पास कास्टिंग से निपटने का एक तरीका है।
पता चला है Class.cast
के रूप में ही नहीं है static_cast
C ++ में। यह अधिक पसंद है reinterpret_cast
। यह एक संकलन त्रुटि उत्पन्न नहीं करेगा जहां यह अपेक्षित है और इसके बजाय रनटाइम के लिए स्थगित हो जाएगा। विभिन्न व्यवहारों को प्रदर्शित करने के लिए यहां एक सरल परीक्षण मामला है।
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 );
}
}
}
तो, ये मेरे सवाल हैं।
- क्या
Class.cast()
जेनिक्स की जमीन पर कब्जा कर लिया जाए? वहां इसके काफी वैध उपयोग हैं। - जब संकलक
Class.cast()
का उपयोग किया जाता है तो संकलक त्रुटियों को उत्पन्न करना चाहिए और संकलन समय पर अवैध परिस्थितियों का निर्धारण किया जा सकता है? - क्या जावा को C ++ के समान भाषा निर्माण के लिए एक कास्ट ऑपरेटर प्रदान करना चाहिए?
Class.cast()
है जब अवैध स्थिति संकलन समय पर निर्धारित किया जा सकता। उस मामले में, हर कोई लेकिन आप सिर्फ मानक कास्ट ऑपरेटर का उपयोग करते हैं। (3) जावा में भाषा निर्माण के रूप में एक कास्ट ऑपरेटर होता है। यह C ++ के समान नहीं है। ऐसा इसलिए है क्योंकि जावा के कई भाषा निर्माण C ++ के समान नहीं हैं। सतही समानता के बावजूद, जावा और सी ++ काफी अलग हैं।