2013-03-27 6 views
8

मैं यह जानने की कोशिश कर रहा हूं कि उछाल के माध्यम से जेनिक्स कैसे प्राप्त करें।जेनिक्स पज़लर

मेरे पास है:

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

और कई "उप-प्रकार" कक्षाएं:

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

क्या मैं चाहता हूँ दो प्रकार पैरामीटर T और S, जहां TType से बाध्य है के साथ एक वर्ग घोषित करने के लिए है और ST और Middle से बाध्य है।

मैं यह सुनिश्चित करने के लिए जेनेरिक के साथ एक तरीका नहीं देख सकता कि ST बढ़ाता है और Middle लागू करता है।

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

या

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

लेकिन न तो निश्चित रूप से कानूनी हैं: क्या मैं चाहता हूँ की तरह कुछ है। शायद कुछ जादू है जो मुझे याद आ रही है?

+2

आप यह नहीं कर सकते हैं। आपके पास कई सीमाएं हो सकती हैं लेकिन वे 0-1 कक्षा और एकाधिक इंटरफेस होना चाहिए। आपके पास एक सामान्य बाध्य स्थिति में जेनेरिक प्रकार नहीं हो सकता है। मुझे संदेह है कि इस प्रतिबंध को रखा गया था क्योंकि कई सीमाओं में टाइप करने के लिए सिंटैक्स चेकर में बहुत जटिलता पैदा होगी, एक दुर्लभ एज केस क्या है। – BevynQ

+2

संबंधित: http://stackoverflow.com/a/13261667/697449 –

+0

धन्यवाद। वह भी मेरा पठन था लेकिन लगा कि यह संभव था कि मैं कल्पना में कुछ खो रहा था। यह है! –

उत्तर

2

SubType को विस्तारित करने वाले एक अमूर्त वर्ग को शुरू करने का प्रयास करें और Middle लागू करता है, इसलिए इसका प्रकार Handler में उपयोग किया जा सकता है।

abstract class MiddleSubtype extends Subtype implements Middle { } 

फिर,

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

संपादित करें: सवाल का अद्यतन के बाद, एक ही विचार की तरह दिखेगा:

abstract class MiddleType extends Type implements Middle { } 

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

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

ध्यान दें कि यह 'टी विस्तार से अलग है, एस टी बढ़ाता है ...' हालांकि, चूंकि 'एस' अब' टी' से बंधे नहीं है। –

+0

हां और यह एक उप प्रकार के हैंडलर से संबंध रखता है। मेरे पास वास्तव में उपप्रकारों का एक समूह है जिसका अर्थ है हैंडलर का एक गुच्छा भी है जो ठीक है जो मैं टालने की कोशिश कर रहा था। –

+0

@NickPalmer इस जवाब में मेरा संपादन देखें - मुझे लगता है कि यह rgettman क्या सुझाव दे रहा था के करीब है। –

0

या आप एस सामान्य ही बना सकता है:

interface SInt<A,B> {} 
class Handler<T extends Root, S extends SInt<T, Middle>>{} 
संबंधित मुद्दे