首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用泛型调用最具体的方法?

如何使用泛型调用最具体的方法?
EN

Stack Overflow用户
提问于 2015-04-22 11:07:52
回答 2查看 121关注 0票数 3

具有以下示例:

代码语言:javascript
复制
public class Test {

    public static class A {}

    public static void main(String[] args) {
        A a = new A();
        m1(a);
    }

    public static <T> void m1(T t) {
        // t.getClass().getSimpleName() is A
        // t instanceof A is true
        m2(t);
    }

    /* Not called */
    public static void m2(A a) {
        System.out.println("A");
    }

    public static void m2(Object o) {
        // o.getClass().getSimpleName() is A
        // o instanceof A is true
        System.out.println("O");
    }

}

我不明白为什么选择m2(Object o)而不是m2(A a)。如您所见,当调用m2(t)时,t“是A”。

输出

  • 实际 O
  • 期望的 一个

在上述情况下,我如何使用泛型来选择m2(A a)

编辑:

我希望有一个通用的解决方案,即使我添加了一个类型的B (类似于A)。

代码语言:javascript
复制
...
public static void main(String[] args) {
    A a = new A();
    m1(a);
    B b = new B();
    m1(b);
}
...
public static void m2(B b) {
    System.out.println("B");
}
...

输出

  • 实际 O O
  • 期望的 a.b
EN

回答 2

Stack Overflow用户

发布于 2015-04-22 11:17:02

你必须做:

代码语言:javascript
复制
public static <T extends A> void m1(T t) {
    m2(t);
}

否则,编译器无法推断传递的参数与m2(A a)和pick m2(Object o)兼容。

票数 4
EN

Stack Overflow用户

发布于 2015-04-22 20:36:03

您正在寻找Java不支持的双重调度。我不认为泛型在这里有帮助,但是您可以用游客设计模式来模仿它:

代码语言:javascript
复制
public class Test {
    public static interface Visitable {
        void accept(Visitor visitor);
    }

    public static class A implements Visitable {
        @Override
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }

    public static class B implements Visitable {
        @Override
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    }

    public static interface Visitor {
        void visit(A a);

        void visit(B b);
    }

    public static class PrintingVisitor implements Visitor {
        @Override
        public void visit(A a) {
            System.out.println("A");
        }

        @Override
        public void visit(B b) {
            System.out.println("B");
        }
    }

    public static void main(String[] args) {
        Visitable visitable = new A();
        m(visitable);
        visitable = new B();
        m(visitable);
    }

    public static void m(Visitable visitable) {
        visitable.accept(new PrintingVisitor());
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29795607

复制
相关文章

相似问题

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