泛型方法参数中的 T 型参数

2022-09-04 19:55:52

假设定义了以下类:

class Shape { }
class Circle extends Shape {  }
class Rectangle extends Shape { }  //  1

您可以编写一个泛型方法来绘制不同的形状:

public static <T extends Shape> void draw(T shape) { }   // 2

Java 编译器将 T 替换为 Shape:

public static void draw(Shape shape) {  } // 3

我的问题是,如果我们在类中直接定义 // 3,那么我们仍然能够传递 ,并引用 //3 中的方法。那么为什么我们需要用类型参数编写 // 2 泛型方法,而该方法将与 //3 完全相同?ShapeCircleRectangle<T extends Shape>

您可以使用相同的示例引用此链接:http://docs.oracle.com/javase/tutorial/java/generics/genMethods.html


答案 1

您可能需要也可能不需要它。如果您的方法必须处理必须与类型完全匹配的其他对象,则需要它,例如:TT extends Shape

public static <T extends Shape> void drawWithShadow(T shape, Class<T> shapeClass) {
    // The shadow must be the same shape as what's passed in
    T shadow = shapeClass.newInstance();
    // Set the shadow's properties to from the shape...
    shadow.draw(); // First, draw the shadow
    shape.draw();  // Now draw the shape on top of it
}

在上面,通过是不够的,因为我们无法制作完全相同类型的阴影。Shape

如果没有这样的要求,一个简单的就足够了。Shape


答案 2

在此特定情况下,不需要泛型方法。

但是,在泛型方法中可以执行更多操作,而不是对其参数调用动态链接的方法。

例如,您可能有一个接受并返回 T 元素集合的泛型方法。通过按类型对其进行参数化,您可以在多个集合类型上使用它。

泛型方法有用的其他示例在此 Java 教程中。


推荐