Java 由另一个泛型限定的泛型类型

Java 由另一个泛型限定的泛型类型,java,generics,bounded-types,Java,Generics,Bounded Types,假设我有这个: interface Shape {} interface Square extends Shape {} interface Circle extends Shape {} interface ShapeBuilder<S extends Shape> {} 接口形状{} 界面正方形延伸形状{} 界面圆延伸形状{} 接口ShapeBuilder{} 我想要这样的东西: class ShapeBuilderFactory<SB extends ShapeBu

假设我有这个:

interface Shape {}
interface Square extends Shape {}
interface Circle extends Shape {}

interface ShapeBuilder<S extends Shape> {}
接口形状{}
界面正方形延伸形状{}
界面圆延伸形状{}
接口ShapeBuilder{}
我想要这样的东西:

class ShapeBuilderFactory<SB extends ShapeBuilder> {
    SB<Square> getSquareBuilder(){...}
    SB<Circle> getCircleBuilder(){...}
}
ShapeBuilderFactory<FunnyShapeBuilder> funnyShapeBuilderFactory = ...;
FunnyShapeBuilder<Square> funnySquareBuilder = funnyShapeBuilderFactory.getSquareBuilder();
类ShapeBuilderFactory{
SB getSquareBuilder(){…}
SB getCircleBuilder(){…}
}
这段代码不会编译(因为ShapeBuilder是一种原始类型),但我希望您理解这一点。 在java中可以做这样的事情吗?怎么做

(真正的问题不在于形状生成器和工厂,为了简单起见,我使用了这个示例)

编辑(更多上下文)

我有不同类型的建筑商:

interface RegularShapeBuilder<S extends Shape> extends ShapeBuilder<S> {}
interface FunnyShapeBuilder<S extends Shape> extends ShapeBuilder<S> {}

class RegularSquareBuilder extends RegularShapeBuilder<Square> {}
class FunnySquareBuilder extends FunnyShapeBuilder<Square> {}
class RegularCircleBuilder extends RegularShapeBuilder<Circle> {}
class FunnyCircleBuilder extends FunnyShapeBuilder<Circle> {}
接口规范ShapeBuilder扩展了ShapeBuilder{}
接口FunnyShapeBuilder扩展了ShapeBuilder{}
类RegularSquareBuilder扩展RegularShapeBuilder{}
类FunnySquareBuilder扩展FunnyShapeBuilder{}
类RegularCircleBuilder扩展RegularShapeBuilder{}
类FunnyCircleBuilder扩展FunnyShapeBuilder{}
我希望工厂能这样做:

class ShapeBuilderFactory<SB extends ShapeBuilder> {
    SB<Square> getSquareBuilder(){...}
    SB<Circle> getCircleBuilder(){...}
}
ShapeBuilderFactory<FunnyShapeBuilder> funnyShapeBuilderFactory = ...;
FunnyShapeBuilder<Square> funnySquareBuilder = funnyShapeBuilderFactory.getSquareBuilder();
ShapeBuilderFactory funnyShapeBuilderFactory=。。。;
FunnyShapeBuilder funnySquareBuilder=funnyShapeBuilderFactory.getSquareBuilder();
类ShapeBuilderFactory{

尽管你可能会考虑是否需要它是通用的。

我不知道为什么你不应该有:

class ShapeBuilderFactory {
    ShapeBuilder<Square> getSquareBuilder(){...}
    ShapeBuilder<Circle> getCircleBuilder(){...}
}
类ShapeBuilderFactory{
ShapeBuilder getSquareBuilder(){…}
ShapeBuilder getCircleBuilder(){…}
}
编辑

因此,如果您的工厂中确实必须有ShapeBuilder子类型,则需要声明它们中的每一个:

class ShapeBuilderFactory<SqB extends ShapeBuilder<Square>, 
                          CiB extends ShapeBuilder<Circle>> {
    SqB getSquareBuilder(){...}
    CiB getCircleBuilder(){...}
}
类ShapeBuilderFactory{
SqB getSquareBuilder(){…}
CiB getCircleBuilder(){…}
}
因此,您必须声明:

ShapeBuilderFactory<FunnySquareBuilder, FunnyCircleBuilder> funnyShapeBuilder = ...
ShapeBuilderFactory funnyShapeBuilder=。。。
但是你可以说

FunnyShapeBuilder<Square> funnySquareBuilder = funnyShapeBuilderFactory.getSquareBuilder();
FunnyShapeBuilder funnySquareBuilder=funnyShapeBuilderFactory.getSquareBuilder();
您遇到的问题是ShapeBuilder的实现只能创建一种类型的形状。这就是您声明它的方式


如果这是我的代码,我会使用我最初编写的
ShapeBuilderFactory
定义,并用有趣的或常规的构建器对其进行实例化。让这些接口实际使用它们难道不重要吗?

将泛型放在factory类上,执行以下操作:

interface Shape {}
interface Square extends Shape {}
interface Circle extends Shape {}

interface ShapeBuilder<S extends Shape> {}

class ShapeBuilderFactory {
    ShapeBuilder<Square> getSquareBuilder(){...}
    ShapeBuilder<Circle> getCircleBuilder(){...}
}
接口形状{}
界面正方形延伸形状{}
界面圆延伸形状{}
接口ShapeBuilder{}
类ShapeBuilderFactory{
ShapeBuilder getSquareBuilder(){…}
ShapeBuilder getCircleBuilder(){…}
}

将ShapeBuilderFactory设置为泛型,您想实现什么?显然,ShapeBuilder不能同时生成正方形和圆形,因为您说过它只能生成一种类型。我试图使factory类能够返回不同类型的生成器(regularBuilder、funnyBuilder等)。我希望有一个regularShapeBuilderFactory和一个funnyShapeBuilderFactory作为同一类的实例。好的,但是为什么他们需要公开他们使用的生成器类型?不同类型的生成器是否做了其他需要子类型的事情?是的,不同类型的生成器有不同的方法(可能在示例中使用构建器不是最佳选择)。因为工厂的每个方法都返回一个不同的泛型构建器。对不起,我把它格式化得很糟糕,结果被吞没了。是的,你是对的。但是真正的代码更复杂,并且与构建器没有任何共同点。我想知道Java是否有任何技巧来解决这个问题,但看起来它没有。无论如何,我更喜欢你的解决方案(我制作了几个工厂类。)谢谢我不希望工厂只使用一种形状,传递给工厂的建设者应该是通用的