2012-08-22 17 views
7

iç sınıfa başvurmanın bir yolu var mı?Bir Java iç sınıfı için sınıf başvurusu

İç sınıfla uyumlu bir dönüş türü belirtmek istiyorum örn.

Class<OuterClass.*> some_method(); 

Bu sözdiziminin geçersiz olduğunu anlıyorum. Bunu ifade etmenin bir yolu var mı?

Bir iç sınıf bir dış sınıf genişletmediği için Class<? extends OuterClass> gibi bir şey kullanamayacağımı biliyorum. Bunun yanı sıra

<T extends OuterClass.InnerClass> Class<T> some_method() 

, sen herhangi iç sınıf bir nesne döndürerek ne kazanacağı:

+2

Bunu neden yapmak istiyorsunuz? Herhangi bir tip güvenliği eklemez. – SLaks

+1

Evet, bir dış sınıfı genişleterek iç sınıf yapabilirsiniz, değil mi? – sp00m

+0

İçsel sınıf, tanımlandığı yerin bir meselesidir. Bir türü bir pakete bağlamanın bir yolunu da isteyebilirsiniz. – Bohemian

cevap

5

Eh, belirli iç sınıflara azından başvurabilir? Bu, herhangi bir nesnenin geri döndürülmesiyle karşılaştırılabilir, artı içsel örneğin dışsal durumla özel bir ilişkisinin olduğu gerçeği. Ancak, muhtemelen bu özel ilişkiyi doğrudan kullanamazsınız.

Düzenleme: Diğerleri işaret

Daha önce InnerClass diğer iç sınıflar tarafından genişletilmiş bir süper sınıf olabilir. Bu, bu sınıfı genişleten herhangi bir sınıfına dönmenize izin verir.

Bir arabirim kullanırsanız, yalnızca sınıflarıyla sınırlı değilsiniz, çünkü bu kısıtlama için statik olmayan iç arabirimlere ihtiyacınız vardır. Ancak, iç arabirimler varsayılan olarak statiktir.

+0

Statik iç sınıflar sadece –

+1

kullanılabilir düşünüyorum @EugenMartynov no, statik olmayan iç sınıfları da kullanabilirsiniz. – Thomas

+0

+1 İyi nokta, teşekkürler. – jldupont

0

Hayır yok. Eğer wildcard ile paketleri başvuramaz gibi: böyle tanımlamalar için

Class<com.example.*> some_method(); 
Class<com.example.?> some_method(); 

kullanım durumları bu kadar sınırlı olacağını, sadece JLS içine yapmazdım. Not, bu tür "konum eşleme türlerini" jeneriklerin kapsamı dışında kullanamazsınız. Örneğin. Daha sonra,

void some_method(OuterClass.* argument); 
void some_method(com.example.* argument); 
3

Doğrusu bir (iç) arabirimini tanımlayacak tüm iç sınıf bir uygulama yapalım ve: Gümrüğe edemez

Class<OuterClass.MyInterface> someMethod(); 

Bu, herhangi bir atıfta bulunmak için çalışmak yerine güvenli daha tip olurdu iç sınıf Ve başka bir kullanım için başka bir iç sınıfa ihtiyacınız olan gün veya bir ders çıkarmaya karar verdiğiniz gün herhangi bir probleminiz olmazdı.

+0

+1 iyi bir seçenek, teşekkürler! – jldupont

+0

Maalesef iç arayüzler desteklenmiyor. Bir iç taban sınıfı olmalıydı. – Thomas

+0

@Thomas "İç arayüzler desteklenmez" den ne demek istiyorsun? Yaygın olarak kullanılırlar ve geri aramaları tanımlamak için çok yararlıdırlar. –

0

İşaretçi arabirimini tanımlayabilir ve bunu İç sınıf tarafından uygulayabilirsiniz.

<T implements CustomMarkerInterface> Class<T> some_method() 

Yani bu java izin verilir OuterClass

public class Outer { 

    public class Inner implements CustomMarkerInterface{ 

    } 

    public class Inner1 implements CustomMarkerInterface{ 

    } 

    public class Inner2 implements CustomMarkerInterface{ 

    } 

} 
0

Class<InnerClass> tüm iç sınıflar için geçerli olacaktır. Belirli bir şey mi arıyorsun?

public class Client 
{ 
interface InnerType 
{ 
} 
public class InnerClass implements InnerType 
{ 
} 
public Class<? extends Client.InnerType> test() 
{ 
    return InnerClass.class; 
} 

} 
İlgili konular