gpt4 book ai didi

Java,我可以将任意接口(interface)应用于现有类吗?

转载 作者:行者123 更新时间:2023-12-03 23:23:14 25 4
gpt4 key购买 nike

如果两个类有一些签名完全相同的方法,但这些方法没有被继承,有没有办法用公共(public)方法定义一个接口(interface),并使用相同的接口(interface)指向两个类的两个实例?

例如,假设一个类 Catboolean isAlive()和另一个类(class)Dogboolean isAlive()但是 CatDog除了 Object 之外没有共同祖先和 boolean isAlive()不是继承的方法。我无法修改 CatDog因为它们是别人写的。我可以随意创建一个这样的界面并用它来指向一只猫或一只狗吗?

interface lovable
{
boolean isAlive();
}

void main()
{
lovable thing = new Cat(); <-- any syntax to achieve this?
love(thing);
}

void love(lovable thing)
{
if (thing.isAlive())
System.out.println("Aww.");
else
System.out.println("Eww.");
}

最佳答案

您可以创建 Can you force a java object into implementing an interface at runtime? 中提到的代理对象:

public interface Loveable {
boolean isAlive();
}

public static class Cat {
boolean isAlive() {
return true;
}
}

public static class Dog {
boolean isAlive() {
return false;
}
}

public static <T> T getWrapper(final Object obj, final Class<T> intface) {
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return obj.getClass().getDeclaredMethod(method.getName(), method.getParameterTypes()).invoke(obj, args);
}
};
return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), new Class[]{intface}, invocationHandler);
}

public static void main(String[] args) throws Exception {
System.out.println(getWrapper(new Cat(), Loveable.class).isAlive());
System.out.println(getWrapper(new Dog(), Loveable.class).isAlive());
}

关于Java,我可以将任意接口(interface)应用于现有类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35655958/

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