java在泛型方法中检查类型
我想知道是否有可能在一个方法中使用if语句来检查所用泛型的类型。在让我思考这个问题的情况下,我希望以不同的方式处理一个非常基本的Point2D
类和一个Point3D
类。在3D点的情况下,我需要访问Point3d.z
,我不确定这是否会导致问题,我想做的伪代码版本是
public <T> void processPoints(T point) {
process(point.x);
process(point.y);
if (T == Point3D) { // What do I do here?
process(point.z); // Will accessing z cause problems?
}
}
实际上process
表示的代码要复杂得多,而且z
依赖于x
和y
,因此我正在寻找一种避免代码重复的方法。我可能会找到一种重载函数的方法,但是我很好奇,这样我可以了解更多关于泛型的知识
# 1 楼答案
一般来说不是这样,因为类型擦除。基本上,执行时不知道
T
的类型你可以使用:
但这与检查
T
本身是否Point3D
并不完全相同。不过这可能是个更好的主意:# 2 楼答案
不,这是不可能的,因为运行时有type erasure。JVM(几乎)对泛型一无所知,它们主要用于编译器检查类型。在使用泛型检查类型之后,编译器替换所有泛型类型,比如说
List<String>
在编译后变成List<Object>
,所以在运行时无法检测到# 3 楼答案
简单的重载和避免泛型如何
如果只有
Point2D
和Point3D
的实例,为什么要使用泛型参数T
您应该寻找其他方法来消除代码重复,而不是使用
instanceof
之类的方法