我是一位经验丰富的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-第二种方法有什么问题吗?我之所以要问的原因是,在看到我上面写的内容之前,我已经看到人们使用反射和一些模糊的技术。想法?
答案 0 :(得分:4)
这里有一些问题:
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
的实例。