实现某个接口并具有特定超类的参数:泛型或instanceof?

时间:2010-06-29 15:45:10

标签: java oop interface abstract-class instanceof

我希望对特定设计有所帮助。这是我希望的代码:

abstract class Square {...}
abstract class Circle {...}

interface JPGExportable {...}

class SquareJPG extends Square implements JPGExportable {...}
class CircleJPG extends Circle implements JPGExportable {...}

interface Interface {
    draw(Square square);
    draw(Circle circle);
}

class Canvas implements Interface {
    draw(SquareJPG squarejpg) {...}
    draw(CircleJPG circlejpg) {...}
}

总之,Canvas应该实现Interface的规范,但是draw-methods应该处理实现JPGExportable的Square和Circle的子类。

据我所知,有两种解决方案可行,但我认为这两种解决方案都不是很漂亮:

/*
 * Using generics
 */
interface Interface<S extends Square, C extends Circle> {
    draw(S square);
    draw(C circle);
}

class Canvas implements Interface<SquareJPG, CircleJPG> {
    draw(SquareJPG squarejpg) {...}
    draw(CircleJPG circlejpg) {...}
}

/*
 * Using instanceof
 */
interface Interface {
    draw(S square);
    draw(C circle);
}

class Canvas implements Interface {
    draw(Square square) {
        if (square instanceof SquareJPG)
            // do stuff now
    }
    draw(Circle circle) {
        if (circle instanceof CircleJPG)
            // do stuff now
    }
}

实际上Square和Circle是相当明显的,为什么一个普通的超类不能包含任何公共代码。而且,实现JPGExportable的超级类会觉得......错了;它真的是一个子功能。

我不喜欢泛型方式的一个根本原因是我需要处理7种不同的类型。也许我很挑剔,但连续7次出现“T延伸类型”看起来很难看。

  • 是否有第三种解决方案看起来更好?
  • 如果没有,两个中哪一个“更好”?

1 个答案:

答案 0 :(得分:2)

使用泛型的恕我直言是优越的,因为这种方式编译器可以给你一些静态类型检查。在第二种情况下,您会在运行时发现错误。

如果没有看到其余的代码,很难找到替代设计。即是否可以绘制任何JPGExportable?也许你只能使用一个方法绘制(JPGEXportable)?