微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我该如何概括呢?

如何解决我该如何概括呢?

我有一个ExampleProperty扩展了超类Property,在一个单独的类GameObject中,我有一个ArrayList<Property> properties以及以下方法,其中{{ 1}}只是将Engine.createEngineObject(new Exampleproperty())添加到列表中并返回它,new Exampleproperty()propertyId的继承成员,而Property是{{1}的列表} s:

properties

我想泛化此方法,以便我可以传递Property并使其返回与public ExampleProperty addExampleproperty() { ExampleProperty temp = (ExampleProperty)Engine.createEngineObject(new Exampleproperty()); temp.propertyId = properties.size(); return temp; } 相同类型的对象(并在第3行执行强制转换?)。恐怕我对泛化还不熟悉,因此不胜感激:)

编辑:这是发布答案后的修订代码。我忘了提一些信息,但是我一直在努力,所以这就是我所拥有的。它可能很糟糕,但是它是我的,它可以工作,我为此感到骄傲:

Class<?> propertyClass

解决方法

这可能会达到目的:

public <T extends Property> T createEngineObject(Class<T> propertyClass) throws IllegalAccessException,InstantiationException {
    Property property = propertyClass.newInstance();
    // do something...
    return property;
}

尽管,传递Property实例似乎是一个更好的主意:

public <T extends Property> T createEngineObject(T property) {
    // do something...
    return property;
}
,

您的主要问题是,您对ExampleProperty所做的事情没有以某种类型捕获。因此,您不能逐字逐句地对此进行概括。

让我们列出您对当前经过硬编码的类型(ExampleProperty)进行的操作,以便我们知道要捕获的类型,以便对其进行概括:

  • 您调用其无参数构造函数
  • 您将其结果作为第一个参数传递给对Engine.createEngineObject的调用。
  • 您将createEngineObject调用的结果强制转换为此类型。
  • 您引用此类型的propertyId字段。
  • 您返回类型。

在所有这些操作中,迄今为止最有问题的操作是第一个操作:构造函数不参与打字系统。您不能以Java类型声明“具有无参数构造函数”。完全没有无论如何。

有两种解决方法:

  1. 仅在文档中以零编译时间保证将其声明,并使用java.lang.Class实例作为媒介,以便代码知道从何处获取该构造函数。无论您传递给此方法的泛型形式的任何类型实际上是否具有无参数构造函数,还是没有抽象性,都不会进行编译时检查。如果您无法通过这些条件,唯一的办法就是在运行时发生一些异常。
  2. 使用工厂。

正确的答案当然是第二个答案:使用工厂。捕捉“可以构成ExampleProperty实例的事物”的概念,因为可以在Java的类型系统中传达 。如果出现这种情况,我们可以将此工厂用作适用于整个类型的一切的工具:

您的通用代码:

public interface PropertyFactory<P extends Property> {
    P make();
}
// NB: You can replace the above with `java.util.function.Supplier` instead,but I'd make your own type.

public abstract class Property {
    int propertyId;
}

public <P extends Property> P addProperty(PropertyFactory<P> factory) {
    P temp = Engine.createEngineObject(factory.make());
    temp.propertyId = properties.size();
    return temp;
}

// in Engine.java
public <P extends Property> P createEngineObject(P property) {
    // do stuff here
    return property;
}

然后使用:

private static final PropertyFactory<ExampleProperty> EXAMPLE_MAKER = ExampleProperty::new;

ExampleProperty ep = addProperty(EXAMPLE_MAKER);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?