我尝试创建此类:
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 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/