2013-02-26 62 views
3

所以我剛剛得知,我可以會員類型具有多個限制

public <T extends SomeClass & SomeInterface<OtherClass>> doSomething(T foo); 

在Java中表達foo延伸SomeClass,也實現了SomeInterface<OtherClass>。到現在爲止還挺好。

但是如何將foodoSomething()賦值給一個成員變量?課程的課程不知道任何與doSomething()方法相關的類型定義。

我需要的上下文是一個POJO,它的構造函數需要與上述T進行爭論,並且需要再次返回上述T

我來最接近的是以下幾點:

public class ThisClass implements AnotherInterface<AnotherClass> { 

    private final Object obj; 

    public <U extends SomeClass & SomeInterface<AnotherClass>> ThisClass(U obj) { 
     this.obj = obj; 
    } 

    public <U extends SomeClass & SomeInterface<AnotherClass>> U getObject() { 
     return (U) obj; 
    } 
} 

但我不能左右風我的頭得到沒有取消選中投的解決方案。

+1

@giorashc:他的構造函數很好:泛型類型,類名,參數。 – jlordo 2013-02-26 15:19:16

+0

ohhh對不起我的錯誤... – giorashc 2013-02-26 15:23:23

回答

1

你能不能讓類通用:

public class ThisClass<U extends SomeClass & SomeInterface<AnotherClass>> 
            implements AnotherInterface<AnotherClass> { 

    private final U obj; 

    public ThisClass(U obj) { 
     this.obj = obj; 
    } 

    public U getObject() { 
     return obj; 
    } 
} 

,並使用它像這樣:

ThisClass<String> instance = new ThisClass<>("Foo"); 
String value = instance.getObject(); 
+0

我想避免這種情況,因爲ThisClass實際上是一個再次被重新實現的抽象類,我必須在每個派生類中攜帶冗長的'U extends SomeClass&SomeInterface ' ,只是另一個'AnotherClass'參數。但我想,這是做到這一點的唯一方法......? – 2013-02-26 15:30:51

0

不幸的是,它無法做到的。問題是Java沒有可指定的攔截類型A&B

如果Java有,我們可以寫類似

Pet&Furry pet; 

    void set(Pet&Furry pet){ this.pet=pet; } 

    Pet&Furry get(){ return pet; } 

現在,類型變量可以攔截範圍A&B,所以人們會認爲我們可以利用這一點

Object pet; 

    <U extends Pet&Furry> void set(U pet){ this.pet=pet; } 

    <U extends Pet&Furry> U get(){ return (U)pet; } 

但它不是類型安全。考慮

x.set(dog); 
    ... 
    Cat cat = x.get(); 

如果我們要求程序員精神上跟蹤實際的類型,我們可能會面臨這種風險。