Java 我应该选择哪种参数类型?扩展超类型或超类型的泛型

Java 我应该选择哪种参数类型?扩展超类型或超类型的泛型,java,generics,methods,Java,Generics,Methods,下面我有一个调用两个方法的驱动程序。第一个方法的参数类型是扩展多边形的泛型类型。第二种方法的参数类型是多边形。这两种方法都需要我强制转换参数,以便调用子类方法。哪个更好?为什么我要用一个而不是另一个 public class Driver { public static void main(String[] args) { Square s1; try { s1 =

下面我有一个调用两个方法的驱动程序。第一个方法的参数类型是扩展多边形的泛型类型。第二种方法的参数类型是多边形。这两种方法都需要我强制转换参数,以便调用子类方法。哪个更好?为什么我要用一个而不是另一个

public class Driver {
        public static void main(String[] args) {

                Square s1;
                try {
                        s1 = new Square(new Point(0,0), new Point(0,1), new Point(1,1), new Point(1,0));
                }
                catch (IllFormedPolygonException e) {
                        System.out.println(e.toString());
                        return;
                }

                System.out.println(s1.toString());
                printArea(s1);
                printArea2(s1);
        }

        public static <T extends Polygon> void printArea(T poly) {
                System.out.println(poly.getArea());

                if (poly instanceof Triangle) {
                        ((Triangle)poly).doTriangleThing();
                }
                else if (poly instanceof Square) {
                        ((Square)poly).doSquareThing();
                }
                else {
                        System.out.println("Is polygon");
                }
        }

        public static void printArea2(Polygon poly) {
                System.out.println(poly.getArea());

                if (poly instanceof Triangle) {
                        ((Triangle)poly).doTriangleThing();
                }
                else if (poly instanceof Square) {
                        ((Square)poly).doSquareThing();
                }
                else {
                        System.out.println("Is polygon");
                }
        }
}
公共类驱动程序{
公共静态void main(字符串[]args){
正方形s1;
试一试{
s1=新正方形(新点(0,0)、新点(0,1)、新点(1,1)、新点(1,0));
}
捕获(格式错误的PolygoneException e){
System.out.println(例如toString());
返回;
}
System.out.println(s1.toString());
打印区(s1);
打印区域2(s1);
}
公共静态空白打印区(T多边形){
System.out.println(poly.getArea());
if(三角形的多边形实例){
((三角形)多边形).dotriangelthing();
}
else if(正方形的多边形实例){
((正方形)多边形)。doSquareThing();
}
否则{
System.out.println(“是多边形”);
}
}
公共静态空白打印区域2(多边形多边形){
System.out.println(poly.getArea());
if(三角形的多边形实例){
((三角形)多边形).dotriangelthing();
}
else if(正方形的多边形实例){
((正方形)多边形)。doSquareThing();
}
否则{
System.out.println(“是多边形”);
}
}
}

选择超级类型。从:

泛型方法允许使用类型参数来表示方法和/或其返回类型的一个或多个参数的类型之间的依赖关系。如果没有这种依赖关系,则不应使用泛型方法

如果参数/返回类型之间没有关系,则泛型不会添加任何内容;这只会使代码更难阅读,因此应该首选更简单的解决方案

下面是一个通用方法非常有用的示例。假设您有一个方法,它接受一个
多边形
,并返回一个大小为一半的副本。由于返回类型与参数类型相同,泛型可用于避免客户端代码中的强制转换:

public static void main(String[] args) {
    Square square = new Square(0, 0, 10, 10);

    // Without the generic it's necessary to cast the return value
    square = (Square) shrink(square);

    // Cast not needed with generic
    square = shrinkWithGenerics(square);
}

public static Polygon shrink(Polygon poly) {
    // ...
}

public static <T extends Polygon> T shrinkWithGenerics(T poly) {
    // ...
}
publicstaticvoidmain(字符串[]args){
正方形=新正方形(0,0,10,10);
//如果没有泛型,则必须强制转换返回值
平方=(平方)收缩(平方);
//泛型不需要强制转换
square=收缩带泛型(square);
}
公共静态多边形收缩(多边形多边形){
// ...
}
公共静态T收缩带泛型(T多边形){
// ...
}

选择超级类型。从:

泛型方法允许使用类型参数来表示方法和/或其返回类型的一个或多个参数的类型之间的依赖关系。如果没有这种依赖关系,则不应使用泛型方法

如果参数/返回类型之间没有关系,则泛型不会添加任何内容;这只会使代码更难阅读,因此应该首选更简单的解决方案

下面是一个通用方法非常有用的示例。假设您有一个方法,它接受一个
多边形
,并返回一个大小为一半的副本。由于返回类型与参数类型相同,泛型可用于避免客户端代码中的强制转换:

public static void main(String[] args) {
    Square square = new Square(0, 0, 10, 10);

    // Without the generic it's necessary to cast the return value
    square = (Square) shrink(square);

    // Cast not needed with generic
    square = shrinkWithGenerics(square);
}

public static Polygon shrink(Polygon poly) {
    // ...
}

public static <T extends Polygon> T shrinkWithGenerics(T poly) {
    // ...
}
publicstaticvoidmain(字符串[]args){
正方形=新正方形(0,0,10,10);
//如果没有泛型,则必须强制转换返回值
平方=(平方)收缩(平方);
//泛型不需要强制转换
square=收缩带泛型(square);
}
公共静态多边形收缩(多边形多边形){
// ...
}
公共静态T收缩带泛型(T多边形){
// ...
}
正如a所说,这里实际上没有理由使用泛型

也就是说,如果您可以访问
多边形
正方形
三角形
类,我会立即重新设计它们,这样您就不必编写
实例了

首先在
Polygon
类中定义
printArea()
,并在子类中定义必要的覆盖,和/或为可打印多边形定义附加接口

第二,如果您不能修改这些类或仅修改
多边形
类,您仍然可以尝试扩展
多边形
类(=使您自己的类更智能),或将其包装到一个SmartPolygon中,例如,您可以将
委托
多边形绑定到该SmartPolygon(参见,或仅使用getter
getPolygon()使其可访问)
。然后使用这个新类执行上面的第一点。

正如a所说,这里实际上没有理由使用泛型

也就是说,如果您可以访问
多边形
正方形
三角形
类,我会立即重新设计它们,这样您就不必编写
实例了

首先在
Polygon
类中定义
printArea()
,并在子类中定义必要的覆盖,和/或为可打印多边形定义附加接口


第二,如果您不能修改这些类或仅修改
多边形
类,您仍然可以尝试扩展
多边形
类(=使您自己的类更智能),或将其包装到一个SmartPolygon中,例如,您可以将
委托
多边形绑定到该SmartPolygon(参见,或仅使用getter
getPolygon()使其可访问)
。然后使用这个新类执行上面的第一点。

我想我明白了。因此,当我需要规定多个参数具有相同类型或某些参数的类型以及t的类型时,我在方法中使用泛型