2013-03-27 13 views
8

Jeneriklerin çemberler arasından nasıl atlayacağını anlamaya çalışıyorum.Generics Puzzler

Ben:

interface Root { } 
interface Middle extends Root { } 
class Type implements Root { } 

Ve birçok "Alt tür" sınıfları:

class Subtype1 extends Type implements Middle { } 
class Subtype2 extends Type implements Middle { } 
... 

İstediğim TType bağlı iki tür parametreleri T ve S, bir sınıf bildirmektir ve S, T ve Middle tarafından bağlanır.

S'un T öğelerini uzattığından ve Middle uyguladıklarından emin olmak için jeneriklerle bir yol göremiyorum.

class Handler<T extends Root, S extends T, S extends Middle>; 

veya

class Handler<T extends Root, S extends <T extends Middle>>; 

Ancak ne dersin

yasal şunlardır: İstediğim gibi bir şeydir. Belkide eksik olduğum bir sihir var mı?

+2

Bunu yapamazsınız. Birden fazla sınırınız olabilir, ancak bunlar 0-1 Sınıf artı çoklu arayüzler olmalıdır. Çoklu bağlı durumda bir Genel türünüz olamaz. Bu kısıtlamanın saklandığından şüpheleniyorum çünkü çoklu sınırlardaki türün sözdizimi denetleyicisi için çok fazla karmaşıklık yaratabileceğinden, nadir görülen bir durum söz konusudur. – BevynQ

+2

ile ilgili olarak: http://stackoverflow.com/a/13261667/697449 –

+0

Teşekkürler. Bu benim de okumamdı, ancak spec'ta bir şeyi kaçırmanın mümkün olduğunu düşündüm. Öldürüyor! –

cevap

2

SubType'u genişleten ve Middle uygulayan bir soyut sınıf tanıtmayı deneyin, böylece türü Handler'da kullanılabilir. Sonra

abstract class MiddleSubtype extends Subtype implements Middle { } 

,

class Handler<T extends Root, S extends MiddleSubtype> { //... 

DÜZENLEME: soruya güncelleştirme ardından, aynı fikri gibi görünecektir:

abstract class MiddleType extends Type implements Middle { } 

class Subtype1 extends MiddleType { } 
class Subtype2 extends MiddleType { } 
... 

class Handler<T extends Root, S extends MiddleType> { //... 
+1

Not: Bu, 'T' Roots, S extends T ... 'den farklıdır, çünkü' S 'artık' T 'ile bağlı değildir. –

+0

Evet ve İşleyiciyi bir alt türe bağlar. Aslında, bir grup İşleyiciden de bahsetmek istiyorum ki bu da kaçınmaya çalıştığım bir şeydir. –

+0

@NickPalmer Bu cevaba yaptığım düzenlemeyi görün - bence bu, rgettman'ın önerdiği şeylere yakın. –

0

Yoksa jenerik kendisini S yapabilir:

interface SInt<A,B> {} 
class Handler<T extends Root, S extends SInt<T, Middle>>{} 
İlgili konular