2012-11-09 35 views
3

可能重複:
Is it possible to reference a nested generic parameter in java?爪哇 - 類範圍的泛型類型未單獨指定實例化

如果我可以在Java泛型一個簡單的問題。是否有語法用於聲明不用作實例化的泛型參數的泛型類類型。例如:

public class <U extends FooUType> BarType<T extends FooType<U>>{ 

    public U getU(){return U;} 
} 

要創建一個BarType我想寫下面,它本身包含U,但我不想單獨指定U.所以:

BarType<SomeT<FooUType>> instance 

我們得到的U隱式地從參數SOMET類型,而不必單獨指定ü。而不是:

public class BarType<U extends FooUType, T extends FooType<U>> 

這就需要:

BarType<FooUType,SomeT<FooUType>> 

我想我在尋找的方法一個類似於同樣的想法:

public <U> boolean StupidMethod(String s){ 
    ... 
} 

我寧可不使用<? extends FooUType>,因爲這會導致返回<U extends FooUType> U的類中的方法返回類型出現問題。

非常感謝您的澄清!

+3

否............. –

+0

不,沒辦法。 –

+0

這是比發現聖誕老人不存在:(至少然後我得到禮物 – ComethTheNerd

回答

2

感謝所有,

最後我去了一個不同的解決方案。基本上我試圖隱藏U這個類是抽象的,所以我加了U作爲一個通用參數,因爲沒有辦法繞過這個。然後我創建了擴展這個類的具體類,讓他們靜靜地填寫U的類型,以便調用者不需要膨脹他們的代碼。

事情是這樣的:

public abstract class MyAbsClass<U extends Foo, T extends Bar<U>>{...} 

public class ConcreteClass<T extends SomeBar> extends MyAbsClass<SilentUType, T> 

其中SomeBar沒有參數。然後,用戶可以只是T實例:

new ConcreteClass<SomeDerivedBar>() 

這整齊地工作了我的情況,所以我希望它可以幫助別人。

+0

+1很好! –

2

正如評論所說,這是不可能的。

我寧願不使用<? extends FooUType>,因爲這會導致返回<U extends FooUType> U的類中的方法返回類型出現問題。

所以,在這裏您要說的是,該類的某些方法返回U ...但您不希望U作爲類型參數。那麼,你不能雙方都有。無論是有這樣的:

public class BarType<T extends FooType<U>, U extends FooUType>{ 

    public U getU() { ... } 
} 

或者這樣:

public class BarType<T extends FooType<? extends FooUType>>{ 

    public FooUType getU() { ... } 
} 

如果它只是喧鬧的實例,您擔心,您可以使用new BarType<>適用與Java 7中沒有的Java 7,申報廠方法使調用者可以使用類型推斷:

public static <T extends FooType<U>, U extends FooUType> BarType<T, U> make() { 
    return new BarType<T, U>(); 
} 
+0

感謝您的建議。考慮到每個人的意見後,我走了一條略有不同的路線。我已經張貼我的解決方案作爲答案,以防萬一它幫助其他 – ComethTheNerd