2012-02-11 67 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; 
    } 
}