我可以用Java进行类型推断吗?是的我可以

时间:2016-08-22 01:13:01

标签: java generics

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

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

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

我虽然这是多余的,并且编译器应该能够推断出类型(C ++为什么不能实现Java:p),但是当我理解泛型如何实现时,我意识到{{ 1}}在运行时基本上是T

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

T

1-这两种技术相比是否有优势(即使用<T> void test(T t) { if (t.getClass() == Integer.class ) { // T is of type Integer. } } 传递Class<T>而不是检查类类型?

2-第二种方法有什么问题吗?我之所以要问的原因是,在看到我上面写的内容之前,我已经看到人们使用反射和一些模糊的技术。想法?

2 个答案:

答案 0 :(得分:4)

这里有一些问题:

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

如果您要执行此操作,我建议您撰写if (t instanceof Integer)而不是使用getClass()执行任何操作。

答案 1 :(得分:1)

  

上述方法有什么问题吗?

绝对!如果你必须&#34;取消屏蔽&#34;泛型类型参数T做一些特殊的事情,你可以在一段单独的代码中做,并且在传递类的方式传递它,或者需要T实现一个提供&#34;特殊&#34;的特定界面功能。

  

上述任何一种技术都有优势吗(即使用Class<T>传递getClass而不是检查类类型?

传递Class<T>技术背后有一个特定的原因 - 让你在没有开始时构建对象。换句话说,当您没有要调用getClass()的对象时,它适用,但您希望返回T的实例。