目前我有這種設置:Java的泛型類型參數使用關係
public class AccountManager extends Manager<AccountBean, AccountConstraint> { }
public class AccountBean implements Bean { }
public class AccountConstraint extends AbstractConstraint { }
一個幾句話:
public abstract class Manager<B extends Bean, C extends AbstractConstraint> {
public final int insert(B b);
public final boolean update(B b);
public final boolean delete(B b);
public final B get(C... c);
public final List<B> search(C... c);
public final List<B> getAll();
}
public interface Bean { }
public abstract class AbstractConstraint { }
在具體使用
Bean
是最低的實體可能。這是數據庫中表的一行的直接實例。AbstractConstraint
的具體實現不應該實現/擴展Bean
的具體實現,除非我在這裏弄錯了。
通過Manager
我可以肯定,你可以通過的是一個具體的版本<Bean, AbstractConstraint>
。
但是目前它是完全有效的定義是:
public class BogusManager extends Manager<AccountBean, CharacterConstraint> { }
這是沒有意義的,我怎麼能限制,使得這是不允許的了的代碼?
我認爲,我有兩個選擇:
1)改變AccountConstraint
到AccountConstraint<AccountBean>
,但我不認爲這將是有效的,因爲類型參數將不會在AccountConstraint
使用本身。
2)有一種方法來定義的關係R
,讓Manager
檢查,如果<B, C>
是關係R
,換句話說,你需要檢查R(B, C)
。但是你還需要能夠定義一個關係R<AccountBean, AccountConstraint>
然後,這將意味着R = Manager
,但我不認爲它可能是真實的。無論如何,如果這是真的,我將如何能夠實現這一點?
問候。
如果約束從不使用它們約束的類型,爲什麼它們與它們有關?也就是說,爲什麼'Manager'沒有任何意義,但是'Manager '卻沒有意義,儘管這些約束似乎沒有做特定於bean的任何事情? –
millimoose
或者換一種說法:也許平行班的層次結構是你應該擺脫的設計氣味,如果它們之間甚至沒有強的耦合。 – millimoose
'AccountConstraint'確實限制了'AccountBean',所以我認爲設計缺陷在那裏。儘管我在'AccountConstraint'本身看不到類型參數。 – skiwi