java - 我不知道如何使用类类型作为参数

标签 java interface type-parameter getconstructor

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

我有一个 Selection 类,它保存有关带有 x、z、宽度、深度信息的 2D 区域的信息。在某个点,矩形或椭圆形将被填充到该选择中。我的 Ellipse 和 Rectangle 类实现了接口(interface) 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 接口(interface)没有构造函数。

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

提前致谢大神

最佳答案

不要这样做。

您要做的是传递“给了我东西的东西”。您实际传入的是“一个可以访问为您提供东西的东西”。

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

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

关于java - 我不知道如何使用类类型作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601945/

相关文章:

java - java doc中关于抽象与接口(interface)的令人困惑的解释

angular - 找不到导出接口(interface)的名称

scala - 理解 Scala 中的类型参数

java - 如何获取泛型类型参数?

java - 读取 scala 流,直到标准出现并消失

java - 在 java google app engine 应用程序上执行 python

创建 TIFF 图像时 Java 堆空间错误

java - 将 SSL 证书导入 Eclipse

c# - 如何在 C# 中实现带有参数和返回值泛型的方法、接口(interface)

java - <U, T extends U> 和 <T, U super T> 不一样吗?