面试题答案
一键面试-
设计泛型接口: 首先定义一个泛型接口
Graphic
,所有具体图形类都要实现这个接口。这个接口可以包含一些通用的方法,比如获取图形的属性等,对于绘制方法,每个具体图形类实现自己的绘制逻辑。public interface Graphic<T extends Graphic<T>> { void draw(); }
这里使用
T extends Graphic<T>
作为类型边界,确保实现类是Graphic
接口的子类型,并且可以在泛型方法中递归使用自身类型。 -
设计具体图形类:
- 圆形类:
public class Circle implements Graphic<Circle> { private double radius; public Circle(double radius) { this.radius = radius; } @Override public void draw() { System.out.println("Drawing a circle with radius " + radius); } }
- 矩形类:
public class Rectangle implements Graphic<Rectangle> { private double width; private double height; public Rectangle(double width, double height) { this.width = width; this.height = height; } @Override public void draw() { System.out.println("Drawing a rectangle with width " + width + " and height " + height); } }
-
图形绘制方法: 定义一个静态方法
drawGraphic
,它接受一个实现了Graphic
接口的对象,并调用其draw
方法。public class GraphicProcessor { public static <T extends Graphic<T>> void drawGraphic(T graphic) { graphic.draw(); } }
-
处理类型转换和兼容性问题:
- 由于使用了泛型和类型边界,Java编译器在编译时会进行类型检查,确保类型安全。例如,如果尝试将一个不实现
Graphic
接口的对象传递给drawGraphic
方法,编译器会报错。 - 对于不同类型图形之间的转换,如果需要在某些情况下进行转换,应该在具体图形类中提供相应的转换方法。比如,如果要将一个正方形(可以看作特殊的矩形)转换为矩形,可以在正方形类中提供一个方法返回对应的矩形对象。但要注意保持转换的合理性和类型安全性。
- 由于使用了泛型和类型边界,Java编译器在编译时会进行类型检查,确保类型安全。例如,如果尝试将一个不实现
-
测试代码:
public class Main { public static void main(String[] args) { Circle circle = new Circle(5.0); Rectangle rectangle = new Rectangle(4.0, 6.0); GraphicProcessor.drawGraphic(circle); GraphicProcessor.drawGraphic(rectangle); } }
在上述代码中,通过泛型接口和类型边界,实现了一个类型安全的图形处理系统,drawGraphic
方法可以接受不同类型的图形对象并正确绘制它们。同时,通过合理的设计避免了类型转换和兼容性问题在运行时出现异常。