java - 使用 2 个泛型参数简化 Java 类

标签 java generics

我尝试创建这个类:

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

我看到主题[博客]: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:

What problem are you trying to solve?

例如,我有图像类。 图像可以是单 channel (灰度图像)和多 channel (RGB、HSB等3 channel 或RGB等4 channel +Alpha channel )。 此外,图像可以将 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并要求转换它为 intfloatint[]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 Kind 中找到。 (pdf)。除此之外,您可以查看 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/

相关文章:

c# - 从方法泛型推断类型

java - OSGi 配置管理服务的现有实现?

java - API < 23 的 Android PermissionsDispatcher

java - 窄转换为 byte 后 128 int 如何变为 -128

java - 如何创建一个只接受泛型参数而不接受原始类型参数的泛型方法?

Java:数据结构和通配符的泛型

Java 泛型有声明

c# - 试图理解约束点——我走在正确的轨道上吗?

java - 无法连接到网址

java - 旋转后图像不在正确的位置(图形)