2013-03-27 80 views
8

我想弄清楚如何讓仿製藥跳過籃球。泛型益智遊戲

我:

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

而且許多 「亞型」 類:

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

我想是聲明一個類有兩個類型參數TS,其中TType約束STMiddle的約束。

我看不出用泛型的方式來確保S擴展爲T AND的實現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 2013-03-28 00:06:04

+2

相關:http://stackoverflow.com/a/13261667/697449 – 2013-03-28 00:13:28

+0

謝謝。這也是我的看法,但認爲有可能我錯過了規範中的某些東西。演員就是這樣! – 2013-03-28 00:29:11

回答

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

請注意,這與'T extends Root,S extends T ...'有所不同,因爲'S'不再受'T'限制。 – 2013-03-28 00:20:54

+0

是的,它將Handler關聯到一個子類型。我其實有一堆亞型,這也意味着一堆處理程序,這正是我想要避免的。 – 2013-03-28 00:27:30

+0

@NickPalmer看到我對這個答案的編輯 - 我認爲這很接近rgettman的建議。 – 2013-03-28 02:22:56

0

或者你可以讓小號通用本身:

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