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

这是java中的东西吗?

如何解决这是java中的东西吗?

所以我想为我正在用 java 编写的游戏引擎创建一个函数,它将返回一个 T 类型的对象。 我的函数代码如下:

public <T> T getComponent(Class<T> tClass)
    {
        for(Component component : components)
        {
            if(component.getClass() == tClass)
            {
                return(T)component;
            }
        }
        return(null);
    }

这很好用,我可以用 getComponent(Component.class); 但是,我希望能够像使用 C# (getComponent<Component>();) 那样调用它,所以我想知道这是否可行。

告诉我它是否可能会很棒,并且给我代码来实现它会更好,感谢您所做的任何贡献,即使只是阅读本文以便更多人看到它。

解决方法

根据评论似乎认为这是不可能的,所以现在关闭了。

,

所以我想也许将类型见证与捕获 connect by 结合使用可能足以解决这个问题。不幸的是,即使那样,擦除也将使其成为不可能(没有 ClassCastException):

Class<T>
,

不,您要实现的目标是不可能的,我可以解释原因。

与 C# 泛型不同,Java 泛型是一个编译时特性。这基本上意味着,在编译 Java 代码之后,不知道关于泛型参数的实际类型的信息。这称为类型擦除,因为泛型参数的类型在编译后丢失或擦除,这意味着虽然您可以技术上声明这样的方法在 Java 中:

public <T> T getComponent() { ... }

并且您可以技术上像这样调用该方法(就像您在 C# 中那样):

getComponent<YourType>();

您实际上无法在方法中获取 T 的类型,因为该信息在运行时不存在,因此编写这样的方法将毫无用处。为了在运行时保留 T 的实际类型,您需要将 T 类型的对象传递给方法,或者将 Class<T> 对象作为参数传递,这就是你在你的代码中做了。

这里的区别最终归结为 Java 和 C# 的开发人员如何选择在他们的语言中实现泛型。如果您想了解更多信息,我强烈建议您查看 C# 和 Java 泛型 here 之间的出色比较。

我只对您提供的代码发表一点意见。您正在此行执行未经检查的演员表:

return (T)component;

但是,由于您将 Class<T> 类型的对象作为参数传递,您可以改为这样进行转换:

return tClass.cast(component);

通过这种方式,您可以摆脱可能从编译器收到的未经检查的强制转换警告。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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”。这是什么意思?