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

  • Charles Renaud

    Charles Rena

    10 Kasım 2007
  • hans peder sahl

    hans peder s

    22 Temmuz 2009
  • max2sims2

    max2sims2

    19 Kasım 2008