2012-02-11 38 views
0

我試圖創建這個類簡化Java類Java class with 2 generic parameters而且主題建議使用此解決方案:2個泛型參數

public class Class1<T extends Class2<E extends Class3>, E extends Class3> { 
    ... 
    public E someFunction(T param) { 
     ... 
    } 
    ... 
} 

這是工作,但在這種情況下,我應該使用2個參數沒有一個:

Class1<Class21<Class31>, Class31> var = ... 

在這個解決方案我重複類'氯ass31' 。有這個任務有更簡單的解決方案,使用下面的代碼:

Class1<Class21<Class31>> var = ... 

UPDATE1:

你想解決什麼問題?

例如,我有圖像類。 圖像可以是單通道(灰度圖像)和多通道(3通道爲RGB,HSB等或4通道或RGB等+ Alpha通道)。 此外,圖像可以在字節0..255或float(0.0,1.0)中保存值RGB,它是不同類型的圖像。 所以,我想爲這個圖像創建類,並構建它:

MyImage<MyChannelType3<MyColorTypeInt>> img1 = ... 
MyImage<MyChannelType3<MyColorTypeFloat>> img2 = ... 
MyImage<MyChannelType1<MyColorTypeFloat>> img3 = ... 

,並有機會獲得顏色像素爲:

int Red  = img1.getPixel(x, y)[0]; 
float Green = img2.getPixel(x, y)[0]; 
float Gray = img3.getPixel(x, y); 

我覺得是比較有用的比:

MyImage<MyChannelType3<MyColorTypeInt>> img1 = ... 
int Red = img1.getPixel(x, y).getChannel(0).getValue(); 

如果我將第一次返回MyChannelType3,而不是MyColorTypeInt然後或返回對象和需求它澆鑄於INT浮子INT []浮子[]

+0

目前尚不清楚你實際詢問的是什麼。你想解決什麼問題?如果您使用博客中建議的表單,我認爲您的聲明應該是'Class1 var'。 – 2012-02-12 02:39:48

回答

2

這種冗餘在Java中是不可避免的。

說明:在Java中的參數正是顧名思義,與實際類型來代替一個類型的形式參數。你需要的是更多。您需要T作爲型構造函數的參數。就像類的構造函數產生類的實例一樣,類型構造函數產生類型。 List是一種類型構造函數,它給出了實際類型String產生的類型List<String>

運用這一知識,您的問題,你想T是一種類型的構造函數接受類型E <: Class3生產類型T <: Class2<E>其中<:是亞型關係。這可能會被聲明和使用如下。

class Class1<T<X extends Class3> extends Class2<X>, E extends Class3> { 
    public E someFunction(T<E> param) { 
     ... 
    } 
} 

Class1<Class21, Class31> var = ... 

關於這個問題進一步閱讀可以在Generics of a Higher Kindpdf)中找到。除此之外,你可以看看Scala,它提供更高的種類。

根據更新編輯:或許可取的解決方案可能是實現PixelAccessor

public class PixelAccessor<C extends YourColor> { 
    public static <C extends YourColor> get(Image<? extends ChannelType<? extends C>> image) { 
     return new PixelAccessor<C>(image); 
    } 

    private final Image<? extends ChannelType<? extends C>> image; 

    private PixelAccessor(Image<? extends ChannelType<? extends C>> image) { 
     this.image = image; 
    } 

    public C getPixel(int x, int y) { 
     // sadly this is unchecked, but "weak" type systems demand compromises 
     @SuppressWarnings("unchecked") 
     C color = (C) image.getPixel(x, y); 
     return color; 
    } 
}