SORU
16 Ocak 2009, Cuma


Nasıl bir yöntem döndürme türü genel yapabilirim?

Bu örnek (OOP kitaplarında tipik) göz önünde bulundurun:
Her Hayvan bir sürü arkadaşın nerede Hayvan bir sınıf var.
Ve Köpek, Ördek, Fare gibi alt sınıfların belirli davranış Ekle bark(), quack() gibi vs vs.

İşte Hayvan sınıfı:

public class Animal {
    private Map<String,Animal> friends = new HashMap<String,Animal>();

    public void addFriend(String name, Animal animal){
        friends.put(name,animal);
    }

    public Animal callFriend(String name){
        return friends.get(name);
    }
}

Ve burada bazı kodlar aynı türde roller vermeyi sürü parçacık var:

Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());

((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();

Diyebilirim ki aynı türde roller vermeyi kurtulmak için dönüş türü için jenerik kullanabilirim, herhangi bir yolu yoktur

jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();

Burada tip hiç kullanılan bir parametre olarak metoda iletti dönüş ile bazı ilk kod.

public<T extends Animal> T callFriend(String name, T unusedTypeObj){
    return (T)friends.get(name);        
}

Bir şekilde ekstra parametre instanceof kullanmadan zamanında dönüş türü anlamaya var mı? Ya da en azından aptal bir örneği yerine bu tip bir sınıf geçerek.
Jenerik zaman tür denetleme, derleme için olduğunu anlıyorum, ama bu geçici bir çözüm.

CEVAP
16 Ocak 2009, Cuma


callFriend Bu şekilde tanımlayabilirsiniz:

public <T extends Animal> T callFriend(String name, Class<T> type) {
    return type.cast(friends.get(name));
}

O zaman bu gibi çağrı:

jerry.callFriend("spike", Dog.class).bark();
jerry.callFriend("quacker", Duck.class).quack();

Bu kodu herhangi bir derleyici uyarıları üreten değil yararı vardır. Tabii ki bu çok önceden genel günlerden döküm sadece güncelleştirilmiş bir sürümü ve herhangi bir ek güvenlik katmıyor.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • geraldnonadoez

    geraldnonado

    3 Temmuz 2013
  • guau . .

    guau . .

    25 Ocak 2008
  • joshsnice

    joshsnice

    28 Kasım 2006