2013-12-14 14 views
5

"ClassA" sınıfının bir örneği olan ancak "Arabirim" arabirimini de uygulayan bir sınıfta bir değişkene ihtiyacım var.A sınıfını genişletmeli ve bazı arabirimleri uygulamalı olan üye değişkeni

Açıkçası bu bir veya kolayca diğeri için yapılabilir:

private ClassA mVariable; 
private InterfaceI mVaraible; 

ama nasıl zorlayabilir nesne hem Classa uzanır ve InterfaceB uygular? gibi bir şey:

private <? extends ClassA & InterfaceI> mVaraible; 

ihtiyacım olanı ama sözdizimi hiçbir fikrim yok ya hatta mümkünse. Ben de bir alma ve kurma yöntemine gerekir, ama bu (sanırım?) Jenerik ile yapılabilir

bariz çözüm bu, ancak InterfaceI ve Sınıf A hem harici kitaplığındaki parçası olan

public class ClassB extends ClassA implements InterfaceI{ 
    //whatever here 
} 

olduğunu libary'nin ClassA ve InterfaceI'yi genişleten sınıfları vardır ve bunları ClassB'yi genişletmek için düzenleyemem, bu nedenle bu çözüm işe yaramayacaktır.

+1

Yapamazsınız, temelde. Değişkeni ayarlarken kontrol edebilir ve gerektiğinde yayınlayabilirsiniz ... ancak sınıfın genelini yapmadan değişkenin kendisinde bu kısıtlamayı ifade edemezsiniz. –

+0

Birden fazla mirasa izin vermek için Java8'de bir sihir var ya da bir çeşit mix-in ... – Thufir

+0

@Jon Skeet Değişkeni ayarlarken nasıl kontrol edersiniz? – jtedit

cevap

1

Oldukça zor bir çözüm buldum.

private ClassA mItemClassA; 
private InterfaceI mItemInterfaceI; 

ayar yöntemi daha sonra aşağıdaki gibidir: aşağıdaki gibidir:

sınıfı, bir Sınıf A ve InterfaceI başvuru içeren

public void setVaraible(ClassA item){ 
    assert (item instanceof InterfaceI); 
    mItemClassA = item; 
    mItemInterfaceI = (InterfaceI) item; 
} 
bu

diğer varyasyonları, bir özel durum atma yanlış geri olabilir , vb. öğenin InterfaceI örneği

örneğiyse, sınıftaki diğer yöntemler daha sonra mItemClassA a kullanarak hem InterfaceI hem de ClassA işlevlerini çağırabilir ve mItemInterfaceI.

Şu an için bir get yöntemi uygulayamayacağım, ancak eğer yapsaydım, arayüzü almak için bir sürüm ve sınıfı almak için bir sürüm olması gerekirdi.

+0

'u kullanabilirsiniz, bunun yerine istisnaları kullanırdım. Varsayılan olarak onaylar kontrol edilmez. Açmanız gereken ekstra bir bayrak. +1 btw. –

0

Bu gibi genel sınıf türleri ile yapabilirsiniz:

private class ClassB <R extends ClassA & InterfaceI> { 
    R mVaraible; 
} 
İlgili konular