让它接受一个classtype:
private T getNext(Class type) {
for (Actor a : getActors()) {
if (type.isAssignableFrom(a.getClass())) {
return (T) a;
}
}
return null; //or type.newInstance(); if you want a guaranteed object,but this restricts your constructor.
}
或者使用Java 8:
private T getNext(Class type) {
return (T) getActors().stream()
.filter(a -> type.isAssignableFrom(a.getClass()))
.findFirst().orElse(null);
}
但用法是一样的:
Monster next = getNext(Monster.class);
打破这个问题,你知道两类事情:
你需要什么:
> t类型的下一个对象.
>确定对象是否为t的方法
类型
你有什么:
>你想要的类型
>一组对象,其中一个可能是t类型
>通过no-args构造函数的新对象(如果没有,则为null)
此外,所有这些方法之间的唯一差异是一回事:它是哪种类型.所以我们确实“将它变成一个变量”,因此它变成了一个方法参数.
打破这一点,我们只需要以完成此任务的方式组织代码:
method: //receives a "type" as a parameter
iterate the list of possible `t`s //our list of objects
if some_t == type //our comparison,prevIoUsly `a instanceof Type`
return some_t //our result is found
return null //or a new object,but essentially our "default"
这里唯一的主要区别是:
>用type.isAssignableFrom(some_t.getClass())替换some_t instanceof类型
这里的原因是,当您使用Class< T>时,这就是您如何确定这一点的原因.
>我们的默认值可以是null或新对象
通过反射动态制作对象会限制您的选项并具有处理异常.返回null或空可选< T>将有助于表明您没有结果,并且呼叫者可以采取相应行动.您也可能只是传递默认对象本身,然后返回到instanceof检查.
问自己这个相同的假设“我需要什么,我能提供什么/有什么”,这将有助于你将问题分解为更小的步骤,并解决更大的难题.