2013-02-23 23 views
6

Farklı türlerde, dönüş türünü yapmak zorunda kalmadan bir yöntemi uygulamaya ve geçersiz kılmaya çalışıyorum.Java olmadan çipte soyut yöntem türleri için farklı dönüş türleri

public abstract class A { 
public abstract Object getValue(String content); 
} 

public class B extends A { 
public String getValue(String content) {...} 
} 

public class C extends A { 
public int getValue(String content) {...} 
} 


public class D extends A { 
public boolean getValue(String content) {...} 
} 

// Main loop: 
for (A a : allAs) 
{ 
// I want to use the method getValue() and corresponding to the type return a String, int or boolean without casting the return type 
} 

Sorum: o döküm zorunda olmadan farklı türde dönmek mümkün mü? Özgün yöntem, sorunu çözmek için nasıl görünüyor? açıkladığınız Ne derleyici dönüş türü bilmeli çünkü bir çözüm bulunması olduğunu düşünüyorum

...

+0

Dönüş türlerine göre geçersiz kılınamaz. –

+0

Ve bu program –

cevap

13

Örneğinizde, C ve D sınıfları derlenmeyecektir. İçindeki geçersiz kılınmış yöntemler, Liskov substitution principle, aka, kendi döndürme türlerini, üst sınıflarıyla uyumlu değildir. Yapmanız gereken şey, jeneriklerle, geri dönüş türünüz olarak ilkellerin kullanımından vazgeçmeye istekli olduğunuz sürece başarılabilir. StringObject bir alt sınıfıdır beri örnekte

abstract class A<T> { 
    public abstract T getValue(String content); 
} 

class B extends A<String> { 
    public String getValue(String content) { } 
} 

class C extends A<Integer> { 
    public Integer getValue(String content) { } 
} 

class D extends A<Boolean> { 
    public Boolean getValue(String content) { } 
} 
+0

Teşekkürler. Bu kod işe yarayabilir. Ancak getValue() döndürme türü bir "Nesne" dir, bu yüzden onu yazmak zorundayım. – erwingun2010

+0

@ erwingun2010 Eğer yönteminiz 'Object' döndürme türüne sahipse, sınıfınızı yanlış uygulamış olabilirsiniz. Bunu yapın: 'A bInstance = new B();' Eğer türü A bildirgesine eklemezseniz, soyut yöntemleriniz 'Object' i döndürecektir. – fiskeben

3

genelde mümkün değildir. Ancak, alt sınıf, üst sınıf yöntemi döndürme işleminin "daha dar" bir alt türünü döndürürse, buna "eşdeğişken dönüş türü" denir ve JDK 1.5'ten beri Java'ya izin verilir. Ancak, örneğinize dayanarak, kovaryant dönüşün sizin aradığınız şey olduğunu düşünmüyorum.

Ne istediğiniz derleyici bu iki tabloların doğru derleme zamanında bilmenin bir yolu vardır, tabii ki, is Buradaki sorun

for (A a : allAs) 
{ 
    String b = a.getValue(); 
    int c = a.getValue(); 
} 

olduğunu varsayalım ve her ikisi de olamaz doğru ol.

+0

derlemeyecek. Tam olarak istediğim bu. Yine de derleyicinin derleme zamanında hangi dönüş türünün doğru olduğunu bilmediğini anlamıyorum. AllA'ları başlattığımda => allAs.add (new B()); allAs.add (yeni C()); – erwingun2010

+0

Gösterdiğim örnekte, döngü içindeki iki deyim, aynı anda hem bir "B" hem de "C" olamayan "A" nin bir _single_ örneğine başvuruyor. Derleyicinin, çalışma zamanına kadar gerçekleşmediğinden hangisinin olduğunu bilmesi nasıl? –

0

, class B tanımı, tamam. Diğer ikisi, ilkel türler olduklarından derleme yapmayacaklar. Bunları çözmek için Integer ve Boolean geri dönüşleri ile değiştirebilirsiniz.

Ana döngünüze gelince, A numaralı başvuru kaynağına başvuruyorsanız, Object değerini döndüren A yönteminin tanımını kullanabilirsiniz.

2

Jenerikler kullanabilirsiniz.

vs ... int bunun için bir dönüş türü olarak çalışmaz, ancak Tamsayı yapar. Jim ve Chris tarafından belirtildiği üzere gibi üzerinde döngü halinde

yazım hatası olabilir bu yüzden bir derleyici de yazarak değilim ...

, yalnızca olan "A" sonucu alabilirsiniz Nesne.

+0

Teşekkürler. Elbette ilkel String, Boolean, Integer, kullanmak zorundayım. – erwingun2010

İlgili konular