首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java,我可以将任意接口应用于现有的类吗?

Java,我可以将任意接口应用于现有的类吗?
EN

Stack Overflow用户
提问于 2016-02-26 15:43:52
回答 3查看 3.9K关注 0票数 4

如果两个类有一些完全相同的签名方法,但这些方法不是继承的,那么是否有任何方法可以使用公共方法定义接口,并使用相同的接口指向两个类的两个实例?

例如,假设一个类Catboolean isAlive(),另一个类Dogboolean isAlive(),但是CatDog除了Object没有共同祖先,boolean isAlive()不是继承的方法。我不能修改CatDog,因为它们是由其他人编写的。我可以任意创建这样的接口并使用它来指向猫或狗吗?

代码语言:javascript
复制
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.");
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-26 16:17:01

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

代码语言:javascript
复制
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());
}
票数 6
EN

Stack Overflow用户

发布于 2016-02-26 16:04:41

如果你自己创造的话:

代码语言:javascript
复制
public interface Lovable{
    boolean isAlive();
}

public class LovableCat extends Cat implements Lovable{

}
代码语言:javascript
复制
public static void main() {
    Lovable thing = new LovableCat();
    love(thing);
}

如果从其他地方返回:

代码语言:javascript
复制
public interface Lovable{
    boolean isAlive();
}

public class LovableCat implements Lovable{

    private Cat cat;

    public LovableCat(Cat cat){
       this.cat = cat;
    }

    public boolean isAlive(){
       return cat.isAlive();
    }
}
代码语言:javascript
复制
public static void main() {
    Lovable thing = new LovableCat(cat);
    love(thing);
}
票数 5
EN

Stack Overflow用户

发布于 2016-02-26 16:22:33

您不能这样做,因为您的类型(猫,狗)必须实现您的接口。但是,如果这个类来自某个库,那么您将有两个解决方案。前面提到的第一个使用包装器,第二个使用反射。我认为lib www.eclipse.org/aspectj可以帮助您以最少的代价实现这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35655958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档