2016-03-26 15 views
0

Sadece bunu yanlış tasarlayabilirim ama 4 farklı türde hayvanım olduğunu söyleyebilirim. Bir kuşum, bir atım, bir farem ve bir balığım var. Hepsini bir hayvan alt sınıfı yapmaya çalıştım ama bu kötü bir tasarım ya da hataya eğilimlidir, fakat hayvandan bazı yöntemleri vardır, hepsinin sahip olmasını istiyorum ve hepsinin aynı yerlerden kullanılabilir olmasını istiyorum.Sadece belirli bir arabirimi uygulayan nesneleri kabul eden bir ArrayList oluşturmak mümkün mü?

Hayvana bir arabirim yaptım ve şimdi hepsinin bir arraylistine sahip olmak istiyorum, ama ArrayList çalışmıyor çünkü Hayvan bir sınıf değil.

Bu konuda bana yardımcı olabilecek herhangi bir kişi var mı, yoksa bunu tasarlamanın daha basit/kolay bir yolu var mı?

Benim animalHouse sınıf

import java.util.ArrayList; 

public class AnimalHouse { 
private ArrayList<? extends Animal> animals; 


public AnimalHouse(Bird a, Bird b) 
{ 
animals = new ArrayList(); 
animals.add(a); 
animals.add(b); 
} 
} 

Kuşum sınıf

public class Bird implements Animal { 

@Override 
public void run() { 
    System.out.println("run"); 

} 

@Override 
public void sit() { 
    System.out.println("sit"); 

} 

} 

ve benim arayüzü

public interface Animal { 
public void run(); 
public void sit(); 
} 
+4

Bir Arabirim Türü Dizisi tamamen mümkündür. Lütfen kodunuzu gösterin. –

+1

listesini "Liste " gibi oluşturabilirsiniz, ancak aldığınızda, alt sınıfların işlevlerini çağırabilmek için alt sınıflarına atamanız gerekir. –

+1

"ArrayList çalışmıyor çünkü Hayvan bir sınıf değil" ifadesi yanlıştır. Başkalarının da istediği gibi, lütfen kodunuzu gönderin ve özellikle sorunun ne olduğunu (derleyici hatası, istisna, vb.) Ve nerede oluştuğunu (gönderdiğiniz kodda hangi satırı) bize bildirin. –

cevap

3

Sen yapabilirsiniz:

ArrayList<Animal> l = new ArrayList<>(); 

Not: Animal, bir sınıf veya burada bir arabirim olabilir. Artık sınıfı genişleten veya arayüzü uygulayan öğeler ekleyebilirsiniz. Sen ? operatör şöyle kullanarak bu arayüz ile bir şey bir 'anonim' türü listesini yapabilir

:

ArrayList<? implements SomeInterface> // in your case 'implements Animal' 

Aksi takdirde, bazı doğrulamasını uygulamak bunu yapmanın iki yolu vardır

+1

Bana ArrayList türünü başlatamadığımı söylüyor quickdash

+0

'u genişletir Programınızın bölümünü istisnayı ve onun stacktrace'ini atarsınız. Kodunuzun özelliklerini tahmin edemeyiz ...;) – schwobaseggl

+0

@quickdash Cevabımda bu parçacığı doğru şekilde nasıl kullanacağımı daha spesifik yaptım. – schwobaseggl

-3

bulgularla ilgili Java'nın instanceof operatörü kullanarak listenizin içerik yönetimi, taban sınıf veya arayüzü:

//adding an element 'newAnimal' to your ArrayList 'zoo' 
//check interface present 
if (newAnimal instanceof Animal) 
{ 
    //inclusion accepted 
    zoo.add(newAnimal); 
} 
else 
{ 
    //error message 
    System.out.print("Animal cannot be accepted!"); 
} 

Umut bu yardımcı olur!

+0

ArrayList <> kullanabiliyor musunuz? Bazı Arayüz uygular>? Bunu denediğimde, uzatmak yerine, "belirteç üzerinde hata sözdizimi" ifadesini kullanıyorum ", beklenen" – quickdash

+0

"Implements" yerine "extends" denemek zorunda kalabilirsiniz, ben hem '' hem de 'instanceof' operatörlerine inanıyorum hem üst sınıflar hem de arabirimler (@quickdash) işlemek üzere ayarlanmıştır – marcuthh

İlgili konular