2012-05-24 25 views
7

Bunu yapmak imkansız gibi görünüyor, ama bu problemin etrafında herkesin zekice bir yolu var mı? S bir bazı bilinmeyen tür arayüzü ve SomeClass olması gerekiyorduBir arayüz olması için jenerik bir tür zorlar mı?

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S> 

iki yönlü bir JDBC resultset işlev açısından benzer bir satır indeksi, bir 2D dizidir. SomeClass'un alt sınıfları, her sütun için özel alıcılara ve ayarlayıcılara sahiptir. Bu yapıdan bir liste yapar gibi yineleyebilmek istiyorum. SomeClass ve Bean arasında, alıcılara ve ayarlayıcılara erişim sağlamak için ortak bir arayüz uygulamak istiyorum. Bu arayüzün olması gerektiği gibi. Ancak verdiğim beyanname çalışmıyor. Bu etrafında çalışmak için bir yolu var mı?

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>{ 

T object; 

public SomeClassWrapper(T object){ 
    this.object = object; 
} 

@Override 
public Iterator<S> iterator() { 
    object.setIndex(-1); 
    return new SomeClassIterator<S>(); 
} 

private class SomeClassIterator<S> implements Iterator<S> { 

    @Override 
    public boolean hasNext() { 
     return object.index() < object.rowSize() - 1; 
    } 

    @Override 
    public S next() { 
     object.next(); 
     //safe because only interface methods allowed, can't further manipulate index 
     return object; 
    } 

    @Override 
    public void remove() { 
     object.deleteRow(); 
    } 
} 
+2

+0

Açıklamada, S, –

+1

@LudwigMagnusson arabiriminde olduğu gibi, 'X' bir sınıf veya arabirim olup olmadığına bakılmaksızın, yalnızca X 'generic tip parametre tanımında kullanılabilir. –

cevap

0

Eğer S ile SomeClass parameterize edilemez:

düzenlemek benim istenen uygulama göstermek için? Sonra ben tam sorunu idrak olmadığını itiraf

public class SomeClassIterableWrapper<S, T extends SomeClass<S>> 
     implements Iterable<S>{ 
+0

SomeClass'ı tamamen farklı bir çözüm olarak değerlendirmeyi düşünüyorum. SomeClass'ın kendiliğinden uygulanabileceği biri. Ancak, bu çözümü kullanmak istemiyorum çünkü SomeClass mevcut kod tabanında çok kullanılıyor. –

+0

Ayrıca, kalıtım yerine kompozisyon kullanmayı da düşünebilirsiniz, böylece mevcut alt sınıflarınız bunun yerine "SomeClass" öğesine bir başvuru tutabilir ve parametrelenebilir. – artbristol

-1

olabilir ama bu önerim geçerli: S bir arayüz oluşturun. S nesnesini döndüren bir yöntem reklam içerir.

public class SImpl implements SWrapper<SImpl> { 

    @Override 
    public SImpl getS() { 
     return this; 
    } 

} 

Artık oluşturabilirsiniz: Eğer kullanım biraz değiştirmek zorunda kalacak ama belki çalıştığını

public class SomeClass<T extends SomeClass & SWrapper<T>> { 

    private final T object; 

    public SomeClass(T object) { 
     this.object = object; 
    } 
} 

public interface SWrapper<S> { 

    S getS(); 

} 

Sonra bir uygulama oluşturun.

0

ben S çünkü bu bağlamda SomeClass & Sı

public class SomeClassIterableWrapper

kesin sınıfı olmak zorunda uzanır düşünüyorum S birşeyler uzanan bir sınıf olması gerekir.

S yerine kullanılan potansiyel sınıflarının ne olduğunu daraltmanın bir yolu var mı? Birden fazla sınıfına sahipseniz, T'nin uzatması gereken birden çok işareti kullanmanız gerekebilir.

+0

Evet, bu sorunu doğru bir şekilde tanımlar. Ne yazık ki, S'nin tanımlayacağı arayüzlerin sayısı daraltılabilecek bir şey değildir ve aslında sadece zamanla büyüyecektir. –

İlgili konular