1

所以我正在创建一个插口插件,但这并不重要。

我有一个选择类,它使用 x、z、宽度、深度的东西保存有关 2D 区域的信息。在某一点,一个矩形或椭圆将被填充到该选择中。我的 Ellipse 和 Rectangle 类实现了一个接口Shape

在 Selection 的构造函数中,我想确定以后使用的形状的类型。我的第一个想法是通过类类型

public Selection(Class<Shape> shapeType) {

所以我可以在之后创建该类的一个对象

Constructor<Shape> cons = shapeType.getConstructor(//Well I also don't know what belongs here);
Shape s = cons.newInstance(this);

好吧,最后我得到了 NullpointerException,因为 Shape 接口没有构造函数。

我只是困惑。我应该将 Shape 接口更改为抽象类还是只在构造函数中传递一些像ELLIPSERECTANGLE这样的整数?有人知道我能做什么吗?

在此先感谢全能者

4

1 回答 1

5

不要这样做。

你想要做的是传递“给我一个东西的东西”。你实际上传递的是“一个可以访问给你东西的东西的东西”。

Class 使您可以访问零个或多个构造函数;它不能保证您可以使用特定参数调用某个实例来为您提供实例。您使用反射发现的问题是您无法保证构造函数的存在。

采取更简单的方法:传入 a Supplier<? extends Shape>,例如Rectangle::new() -> new Ellipse(10, 20)。这在编译时检查以确保构造函数存在。

于 2018-04-01T20:20:02.450 回答