繁体   English   中英

Java:根据名称返回扩展类

[英]Java: Returning an extended class given it's name

在下面的代码中,我返回一个类,该类在给定类名的情况下扩展了Entity的类型(然后对其进行更正,以便Class.forName可以正确找到它)。

如何修改它,以便我仍可以返回扩展Entity的类而无需使用 @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<? extends Entity> Class<? extends Entity>此强制转换是不安全的,因此编译器会警告您。

另一种方法是在if-else块中使用实际的Class对象代替名称。

如果您可以在编译时访问该类,则可以返回org.bukkit.entity.Egg.class而不是调用forName 如果不能,您将无法使用注释。

编译器仅通过查看Class.forName(...)调用的可能值就无法猜测类是否扩展了Entity

您可以使用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;
    }

回答您的问题: Class.forname不是很“安全”的代码,因此您将获得编译消息。 我想说的是坚持使用您拥有的东西,因为它有效。

几点说明:与其使用大量的if块来确定实体子代的名称,不如使用以下代码。

name = name.toLowerCase();
name = name.substring(0,1).toUpperCase() + name.substring(1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM