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

Farklı döküm operatörü farklı Derleyic...
Java döküm arayüzleri...
Döküm operatörü açık olabilir mi?...
Java döküm havai tanıtmak mı? Neden?...
'kısa' - Java döküm ilkel tü...