在下面的代码中,我返回了一个类,该类扩展了给定类名称的实体类型(然后它会更正它,以便Class.forName
可以正确找到它)。
如何修改它,以便我仍然可以返回一个扩展实体的类而不使用 @SuppressWarnings("unchecked")
?
我用T
厌倦了一些变化,只是?
但无法想出答案。
@SuppressWarnings("unchecked")
public static Class<? extends Entity> getProjectile(String name) {
if (name.equalsIgnoreCase("ARROW"))
name = "Arrow";
else if (name.equalsIgnoreCase("ENDERPEARL"))
name = "EnderPearl";
else if (name.equalsIgnoreCase("EXPERIENCEORB"))
name = "ExperienceOrb";
else if (name.equalsIgnoreCase("FIREBALL"))
name = "Fireball";
else if (name.equalsIgnoreCase("FIREWORK"))
name = "Firework";
else if (name.equalsIgnoreCase("SMALLFIREBALL"))
name = "SmallFireball";
else if (name.equalsIgnoreCase("SNOWBALL"))
name = "Snowball";
else
name = "Egg";
try {
return (Class<? extends Entity>) Class.forName("org.bukkit.entity." + name);
} catch (ClassNotFoundException e) {
return Egg.class;
}
}
。 Class.forName(String)
被声明为返回类型 Class<?>
的引用,如果您希望它符合Class<? extends Entity>
,则必须强制转换该引用 此强制转换不安全,因此编译器会警告您。
另一种方法是将实际的Class
对象放在if-else
块中,而不是名称中。
如果您可以在编译时访问该类,则可以返回,说org.bukkit.entity.Egg.class
而不是调用forName
。如果你不能,你就会被注释所困。
回答你的问题:Class.forname
不是很"安全"的代码,所以你会得到编译消息。我会说坚持你所拥有的,因为它有效。
一些评论:与其使用庞大的 if 块来确定实体子级的名称,不如使用以下代码。
name = name.toLowerCase();
name = name.substring(0,1).toUpperCase() + name.substring(1);
无法仅通过查看调用的可能值来猜测类是否扩展Entity
Class.forName(...)
。
您可以使用 Class aClass
变量而不是 String name
来存储答案以避免警告:
public static Class<? extends Entity> getProjectile(String name) {
Class<? extends Entity> ans;
if (name.equalsIgnoreCase("ARROW"))
ans = Arrow.class;
else if (name.equalsIgnoreCase("ENDERPEARL"))
ans = EnderPearl.class;
else if (name.equalsIgnoreCase("EXPERIENCEORB"))
ans = ExperienceOrb.class;
else if (name.equalsIgnoreCase("FIREBALL"))
ans = Fireball.class;
else if (name.equalsIgnoreCase("FIREWORK"))
ans = Firework.class;
else if (name.equalsIgnoreCase("SMALLFIREBALL"))
ans = SmallFireball.class;
else if (name.equalsIgnoreCase("SNOWBALL"))
ans = Snowball.class;
else
ans = Egg.class;
return ans;
}