Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
问题:以下接口有什么问题:
public interface House { @Deprecated public void open(); public void openFrontDoor(); public void openBackDoor(); }
答案文档应该反映出为什么不推荐使用 open
以及使用什么。例如:
public interface House { /** * @deprecated use ofopen
* is discouraged, use *openFrontDoor
or *openBackDoor
instead. */ @Deprecated public void open(); public void openFrontDoor(); public void openBackDoor(); }
问题:考虑问题 1 中所示的 House
接口的这种实现。
public class MyHouse implements House { public void open() {} public void openFrontDoor() {} public void openBackDoor() {} }
如果编译此程序,编译器会生成警告,因为不推荐使用 open
(在接口中)。你能做些什么来摆脱那个警告?
答案:你可以弃用 open
的实现:
public class MyHouse implements House { // The documentation is // inherited from the interface. @Deprecated public void open() {} public void openFrontDoor() {} public void openBackDoor() {} }
或者,你可以取消警告:
public class MyHouse implements House { @SuppressWarnings("deprecation") public void open() {} public void openFrontDoor() {} public void openBackDoor() {} }
以下代码是否可以正常编译而不出错?为什么或者为什么不?
public @interface Meal { ... } @Meal("breakfast", mainDish="cereal") @Meal("lunch", mainDish="pizza") @Meal("dinner", mainDish="salad") public void evaluateDiet() { ... }
答案:代码无法编译。在 JDK 8 之前,不支持可重复的注解。从 JDK 8 开始,代码无法编译,因为 Meal
注解类型未定义为可重复。可以通过添加 @Repeatable
元注解并定义容器注解类型来修复它:
@java.lang.annotation.Repeatable(MealContainer.class) public @interface Meal { ... } public @interface MealContainer { Meal[] value(); }
id
,synopsis
,engineer
和 date
。为工程师指定默认值 unassigned
,为日期指定 unknown
。
答案:
/** * Describes the Request-for-Enhancement (RFE) annotation type. */ public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date() default "[unknown]"; }