2011-02-10 17 views
5

Şu an için böyle bir şeye sahibim: -Genel sınıfta jenerik metod isimleri oluşturuluyor mu?

public class MyHolder<T> { 
    private T value; 

    public MyHolder(T t) { 
     this.value = t; 
    } 

    public T getValue() { 
     return first; 
    } 

    public void setValue(T t) { 
     this.first = t; 
    } 
} 

Bunun ile şöyle kullanabilirim: -

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.getValue(); // returns bean 

getValue() ve setValue(..) olsun, getter/setter çağırmak yerine "generify" de mümkün mü?

Temelde, gönderilen türe bağlı olarak getMyBean() ve setMyBean(..) olması güzel olurdu. Ancak bu çok basit bir örnektir. Ancak, N jenerik özellikleri alan genel bir tutucu sınıf oluşturursam, o zaman getValue1() veya getValue2() yerine anlamlı bir şey aramak güzel.

Teşekkürler.

+1

N genel özelliklerini alan genel bir tutucu sınıfı oluşturmamalısınız. Kullanışlı bir ad ve kullanışlı alan adları ile gerçek bir sınıf yapın. – ColinD

+1

Mümkün olsa bile, istediğiniz şekilde kullanılamadığından eminim. – maaartinus

cevap

5

Hayır. Java'da böyle bir özellik yoktur. Sözdizimsel olarak nasıl görüneceğini hayal bile edemiyorum ... void set<T>();? Ve örneğin MyHolder<? extends Number> için alıcı/ayarlayıcı nasıl görünüyor?

1

Hayır, girişinize bağlı olarak MyHolder sınıfının üretilmesi için bir çeşit kaynak kodu üretmezseniz bu mümkün değildir.

Ancak diğer yandan, bu olasılığa sahip olsanız bile, Map<String, T> kullanmanın nasıl farklı olacağı. Bu nedenle, başvuru aşağıdakileri okuyacaktır:

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.get('value'); 
1

Hayır, mümkün değil. Java jenerik türleri, tür silme esasına dayanır, yani, çoğunlukla derleyici tarafından sağlanan sözdizimsel şekerdir. Bu, her bir jenerik sınıfın aslında "raw type" ile kullanıldığı ve tip parametrelerinin Object olduğu ve zaten tüm yöntemleri içerdiği anlamına gelir. Dolayısıyla, tip parametrelerine bağlı olarak farklı yöntemlere sahip olmak mümkün değildir.

+1

Silme işleminin bununla ilgili olduğunu söylemem. Bunun için bir sözdizimi varsa, derleyici bu yöntem adlarını türetebilir. Sadece desteklenmiyor. – aioobe

+1

Silme işleminin amaçlarını yerine getirmek için orijinal yöntem adına indirgenen tamamen derleme zamanı olacağı için silme işleminin bunu engellediğini sanmıyorum. Bu fikirle ilgili bir sürü başka problem olmadığını söylemem. – ColinD

+1

Sileceklerin bununla bir ilgisi var - kaynak kodunda 'getMyBean' yöntemi ve derlenmiş kodda ne var? GetValue ile derleme yapmaz. Bu yüzden, 'getMyBean' yazıp orada yeniden silmeniz gerekir. – maaartinus

İlgili konular