我尝试创建此类:

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


我看到了[blog]主题:Java class with 2 generic parameters,其中的主题建议使用此解决方案:

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


这是可行的,但是在这种情况下,我应该使用2个参数而不使用一个:

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


在此解决方案中,我复制了“ Class31”类。使用以下代码使这个任务有更简单的解决方案:

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


更新1:


  您要解决什么问题?


例如,我有图像课。
图像可以是单通道(灰色图像)和多通道(RGB,HSB等为3通道,或RGB等为4通道+ Alpha通道)。
此外,图像可以将值RGB保存在字节0..255或浮点数(0.0,1.0)中,并且它是不同类型的图像。
因此,我想为此图像创建类并将其构造为:

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,然后赋值或返回Object并要求将其强制转换为int,float,int []或float []。

最佳答案

在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;
    }
}

关于java - 使用2个通用参数简化Java类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9245139/

10-11 04:39
查看更多