SORU
12 EKİM 2009, PAZARTESİ


Java Sınıf.() döküm döküm operatörü vs.

C-style cast operatörünün kötülükleri hakkında C günlerim sırasında öğretilen olması ilk başta Java 5 java.lang.Class cast bir yöntem elde ettiğini bulmak için memnun oldu.

Son olarak döküm ile ilgili OO bir yolu olmadığını düşünmüştüm.

Class.cast meğer C static_cast aynı şey değildir . reinterpret_cast Daha fazla gibi. Beklenen bir derleme hatası oluşturmaz ve yerine çalışma zamanı başvuracağım. Burada farklı davranışlar göstermek için basit bir test çalışması.

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 );
        }
    }
}

Yani, bu sorularıma.

  1. Class.cast() Jenerik topraklara sürgün edilmeli? Pek çok meşru bir kullanım şekli var.
  2. Derleyiciler Class.cast() kullanılır ve yasadışı koşulları derleme zamanında tespit edilebilir zaman hatalara derlemek gerekir?
  3. Java bir dil olarak atama operatörü C benzer bir yapı sağlamalıdır ?

CEVAP
12 EKİM 2009, PAZARTESİ


Sadece hiç Class kullanmadım.tehditleri önlemek için(Nesne) cast "kara". jenerik Ben sık sık yöntem bu gibi şeyler yaptığını görüyorum

@SuppressWarnings("unchecked")
<T> T doSomething() {
    Object o;
    // snip
    return (T) o;
}

Genellikle en iyisi ile değiştirmek için

<T> T doSomething(Class<T> cls) {
    Object o;
    // snip
    return cls.cast(o);
}

Bu Sınıf için tek usecase.(Nesne) karşılaştığım attı.

İlgili derleyici Uyarı: Bu Sınıf şüpheleniyorum.cast(Nesne) derleyici için özel değil. Statik olarak kullanıldıĞında optimize edilmiş olabilir (örneğin, Foo.sınıf.cast(o) cls yerine.cast(o)) ama kimseye derleyici bu optimizasyonu binanın çaba biraz değersiz yapar bunu kullanarak gördüm.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kruno j

    kruno j

    6 Mayıs 2007
  • OnlyFunClips

    OnlyFunClips

    16 ŞUBAT 2012
  • Rooster Teeth

    Rooster Teet

    11 Temmuz 2006