2017-02-07 45 views
0

我有一個ModelDecorator助手。我希望它有下列公共APIJava - 類公共API上的界限

class ModelDecorator<T>{ 
    public static <T> ModelDecorator<T> create(Class<T> clazz); 
    public <SUPER> T from(SUPER fromInstance); 
} 

因此,考慮到類A,B延伸的,可以這樣使用:

A a = new A(); 
B b = ModelDecorator.create(B.class).from(a); 

但我想對T和SUPER界限,所以我確保只有子類可以使用API​​實例化。在這個時刻,我可以這樣做:

C c = new C(); 
B b = ModelDecorator.create(B.class).from(c); 

如果B不從C

任何想法繼承?由於

+1

可能的重複[爲什麼不能有一個Java類型參數有一個下界?](http://stackoverflow.com/questions/4902723/why-cant-a-java-type-parameter-havea-a-下界) – shmosel

回答

3

我看到了約束你的類型參數T延長類型參數S,唯一的辦法就是把這些定義爲類定義:

public class ModelDecorator<S, T extends S> { 
    public static <S, T extends S> ModelDecorator<S, T> create(Class<T> clazz) { ... } 
    public T from(S instance) { ... } 
} 

這些類

class A {} 
class B extends A {} 
class C {} 

你現在可以寫下面的代碼:

A a = new A(); 
B b1 = ModelDecorator.<A, B> create(B.class).from(a); // compiles fine 

C c = new C(); 
B b2 = ModelDecorator.<C, B> create(B.class).from(c); // bound mismatch here 

第二個B創建現在有一個編譯器錯誤。

不幸的是,您現在必須明確提供類型參數,因爲編譯器無法從簡單的方法調用create(B.class)推斷出類型AC

+0

這實際上是現在的方式。我只是不喜歡我的API這種方式:(我是否太挑剔? –

+0

我沒有說可讀性或有用性,也許你正在試圖解決一個不合適的技術問題([XY問題](http: //meta.stackexchange.com/questions/66377/what-is-the-xy-problem))? – Seelenvirtuose

+0

@Seelenvirtuose我可能是錯的,但'create'是'static'方法,'S'和'T'在'public static ModelDecorator create'與'public class ModelDecorator '?如果不是,則爲'static'方法使用不同的類型參數, 'class'是一個更好的選擇嗎? – CKing