gpt4 book ai didi

java - 您可以将对象强制转换为它未显式实现的接口(interface)吗?

转载 作者:行者123 更新时间:2023-12-02 11:01:35 31 4
gpt4 key购买 nike

我对实现 Strategy pattern 特别感兴趣其中一个(或多个)策略来自第三方库。

我有一个第三方库,其中包含这样的类:

public class LibraryClass {
public void doSomething() {
// ...
}
}

然后我使用相同的接口(interface)创建了自己的类:

public class MyClass {
public void doSomething() {
// ...
}
}

现在在我的代码中我想执行以下操作:

public class MainActivity extends AppCompatActivity {
public interface Strategy {
void doSomething();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
Strategy oneClass = (Strategy)(new MyClass());
Strategy twoClass = (Strategy)(new LibraryClass());
oneClass.doSomething();
twoClass.doSomething();
}
}

在本例中,该方法存在,因此该接口(interface)技术上有效,但并未显式实现。当我尝试这样做时,它引发了运行时错误:

java.lang.ClassCastException: MyClass cannot be cast to MainActivity$Controls

最坏的情况我知道我可以使用 Proxy patternLibraryClass 包装在确实实现 Strategy 接口(interface)的内容中:

public class LibraryClassProxy implements Strategy {
private LibraryClass internal;
public void LibraryClassProxy() {
internal = new LibraryClass();
}
public void doSomething() {
internal.doSomething();
}
}

但如果可能的话,我宁愿避免这种情况 - 特别是因为我扩展的类实现许多其他接口(interface),而我宁愿不这样做必须代理每个公共(public)方法。

最佳答案

正如其他人指出的那样,Java 中的接口(interface)定义基于显式声明。我相信 Adapter 涵盖了您所描述的情况。设计模式,而不是代理:

Intent: Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. ---GoF p. 139

您指出的“代理”解决方案对应于适配器模式的对象变体。如果 LibraryClass 不是最终版本,可以考虑的一个选择是使用模式的 class 变体:

class MyLibraryClass extends LibraryClass implements Strategy {
/* ... */
}

关于java - 您可以将对象强制转换为它未显式实现的接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58400073/

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