使用返回类型中的泛型克服类型转换
在 OOP 编程中,类通常维护相关对象的集合。例如,Animal 类可能会跟踪朋友列表,该列表可以是各种子类(例如 Dog 和 Duck)的实例。
传统上,由于朋友的异构性,从该列表中检索特定朋友需要进行类型转换。集合。这会产生如下代码:
Mouse jerry = new Mouse(); jerry.addFriend("spike", new Dog()); jerry.addFriend("quacker", new Duck()); ((Dog) jerry.callFriend("spike")).bark(); ((Duck) jerry.callFriend("quacker")).quack();
为了避免这种繁琐的类型转换,请考虑使用泛型使 callFriend 方法的返回类型特定于正确的子类。但是,在这种特定场景中,将返回类型指定为参数,例如:
public <T extends Animal> T callFriend(String name, T unusedTypeObj) { return (T)friends.get(name); }
没有帮助,因为未使用的类型参数在运行时不提供其他信息。
相反,有一种解决方法涉及将所需类型的类作为参数传递给 callFriend:
public <T extends Animal> T callFriend(String name, Class<T> type) { return type.cast(friends.get(name)); }
通过此实现,方法调用变为:
jerry.callFriend("spike", Dog.class).bark(); jerry.callFriend("quacker", Duck.class).quack();
此解决方案消除了运行时类型转换,并确保返回的对象可以安全地转换为所需的子类。
以上是从异构集合中检索对象时,泛型如何消除类型转换?的详细内容。更多信息请关注PHP中文网其他相关文章!