如何解决我该如何概括呢?
我有一个类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类型声明“具有无参数构造函数”。完全没有无论如何。
有两种解决方法:
- 仅在文档中以零编译时间保证将其声明,并使用
java.lang.Class
实例作为媒介,以便代码知道从何处获取该构造函数。无论您传递给此方法的泛型形式的任何类型实际上是否具有无参数构造函数,还是没有抽象性,都不会进行编译时检查。如果您无法通过这些条件,唯一的办法就是在运行时发生一些异常。 - 使用工厂。
正确的答案当然是第二个答案:使用工厂。捕捉“可以构成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 举报,一经查实,本站将立刻删除。