我知道是否可以在方法中使用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
,因此我正在寻找避免代码重复的方法。我可能会想出一种方法来重载函数,但我很好奇,所以我可以了解更多关于泛型的信息。
答案 0 :(得分:5)
普通的旧超载和避免泛型怎么样?
public void processPoints(final Point2D point)
{
process(point.x);
process(point.y);
}
public void processPoints(final Point3D point)
{
process(point.x);
process(point.y);
process(point.z);
}
如果您只有Point2D
和Point3D
的实例,为什么要使用通用参数T
?
您应该寻找其他方法来删除代码重复,而不是使用instanceof
等。
答案 1 :(得分:3)
我知道是否可以在方法中使用if语句来检查所用泛型的类型。
不一般,不 - 因为类型擦除。基本上,执行时不知道T
的类型。
您可以使用:
if (point instanceof Point3D)
但是完全与检查T
本身是否Point3D
相同。这可能是一个更好的主意:
public void processPoints(Point point) {
process(point.x);
process(point.y);
if (point instanceof Point3D) {
Point3D point3d = (Point3D) point;
process(point3d.z);
}
}
答案 2 :(得分:1)
不可能,因为运行时type erasure。 JVM几乎不知道泛型,它们主要用于编译器检查类型。使用泛型编译器替换所有泛型类型检查类型后,编译后List<String>
变为List<Object>
,因此在运行时无法检测到。