gpt4 book ai didi

java - 通过向它添加方法来扩展 Java 库

转载 作者:搜寻专家 更新时间:2023-11-01 02:39:36 25 4
gpt4 key购买 nike

我试图了解如何在 Java 中正确地“扩展”第 3 方库(包括类和接口(interface))以及如何简单地将它们用作直接替代品。

我目前正在使用 Twitter4J图书馆。现在我必须手动将 @ 添加到 UsergetScreenName() 方法的结果中每次我调用它时:

twitter4j.User user = getTwitterUser();
String userHandle = "@" + user.getScreenName();

我目前已经尝试了一些方法,但没有任何效果。这是我想出的:

package my.app;

public abstract class User implements twitter4j.User {
public String getHandle() {
return "@" + getScreenName();
}
}

这样调用:

User user = (User) getTwitterUser();
String userHandle = user.getHandle();

这会崩溃并显示消息:

java.lang.ClassCastException: twitter4j.UserJSONImpl cannot be cast to my.app.User

最佳答案

Java 对象的工作方式有点像在现实世界中。

我们打个汽车比喻。你的地方旁边有一个卖车的车库。所以你可以从车库里得到一辆车:

Car car = garage.buyCar(money);

车库恰好出售的汽车是沃尔沃。所以,你得到一辆车,而这辆车(Car 是一个接口(interface))实际上是一辆沃尔沃。如果你知道这辆车是沃尔沃,你可以这样做:

Volvo car = (Volvo) garage.buyCar(money);

这根本不会改变车库销售汽车的方式,或者车库销售的汽车类型。只是因为您知道它们是沃尔沃,所以您可以转换结果以访问沃尔沃汽车的特性。

请注意,这现在有效。但没有什么能阻止车库后来决定出售大众汽车而不是沃尔沃汽车。如果他们这样做,类型转换将不再有效,这将是你的错:车库告诉你它卖汽车,但没有 promise 它会是沃尔沃。

现在,您希望车库改为生产保时捷。努力去做

Porsche car = (Porsche) garage.buyCar(money);

不会工作。仅仅因为您非常希望这辆车成为保时捷,不会神奇地将车库生产的沃尔沃改成保时捷。


你不能那样扩展库

您所能做的就是获取 User 并调用一个实用程序方法来创建该用户的句柄。或者创建您自己的 UserWithHandle 类来实现 User,添加 getHandle() 方法,并通过委托(delegate)给原始方法来实现所有其他方法, 包装用户:

UserWithHandle u = new UserWithHandle(getTwitterUser())

如果库允许您提供 UserFactory 实现,您可以做您想做的事,这将取代它以您自己的方式创建用户的方式。有点像车库允许您提供自己的油漆工。


做你想做的事,即向现有类添加方法在 Java 中是不可能的,但在某些语言中是可能的,例如 Kotlin(它与 Java 兼容并在 JVM 上运行,如果你感兴趣的话),其中它们被称为扩展方法。基本上,这些方法是静态实用方法,例如,将 User 作为参数并返回其句柄,但可以像调用 User 的实例方法一样调用.

关于java - 通过向它添加方法来扩展 Java 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36952056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com