如何解决这是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 举报,一经查实,本站将立刻删除。