gpt4 book ai didi

java - 我可以在 Java 中进行类型推断吗?我可以

转载 作者:行者123 更新时间:2023-12-01 16:51:35 25 4
gpt4 key购买 nike

我是一名经验丰富的 C++ 开发人员,正在学习 Java 抽象概念。

我正在寻找是否可以在 java 中进行类型推断,答案通常是否定的,并且在调用泛型函数时我需要传递 Class 类型。像这样:

<T> void test(T t, Class<T> clazz);

我虽然这是多余的,编译器应该能够推断类型(C++ 可以推断类型,为什么 Java 不能:p),但是当我理解泛型是如何在幕后实现时,我意识到 T本质上是 Object在运行时。

但后来我意识到我仍然可以调用Object T 实例上的成员函数。所以我可以做这样的事情:

<T> void test(T t) {
if (t.getClass() == Integer.class ) {
// T is of type Integer.
}
}

1- 两种技术相比另一种技术是否有优势(即传递 Class<T> 优于使用 getClass 检查类类型)?

2- 第二种方法有什么问题吗?我问这个问题的原因是,我看到人们在遵循我上面所写的内容之前就已经使用了反射和一些晦涩的技术。有想法吗?

最佳答案

这里有几个问题:

  • 一般来说,您不应该在运行时真正检查事物的类型。这本身并没有错误,但如果您觉得有必要这样做,那么您可能采取了错误的方法。例如,对于泛型,泛型方法的全部要点在于,无论参数类型如何,它都可以工作。
    • 与 C++ 不同,Java 没有任何模板专门化的概念; Java 程序员对这种限制感到满意。惯用的 Java 代码不会试图规避它。
  • 无法保证 t.getClass()与类型 T 相同; t可能是 T 子类型的实例, 例如。 (而 Class<T> 保证为类型 T ,除非它为空,或者除非程序通过绕过泛型类型系统“污染了堆”。)

如果您要这样做,我建议您写 if (t instanceof Integer)而不是用 getClass() 做任何事情.

关于java - 我可以在 Java 中进行类型推断吗?我可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com