【问题标题】:Why doesn't polymorphism work in a generics method when using an interface?为什么在使用接口时多态在泛型方法中不起作用?
【发布时间】:2012-06-17 08:28:03
【问题描述】:

我正在尝试使用泛型编写一个适应不同类型接口的方法。

在这段代码中,我预计 f an g 方法会打印出“BB”而不是“interface A”。为什么会这样?

interface A {
    String n="interface A";
}

interface B extends A {
    String n = "BB";
}

public class Main {
    <T extends A> void f() {
        T a = null;
        System.out.println(a.n);
    }

    <T extends A> void g() {
        System.out.println(T.n);    
    }

    public static void main(String[] args) {
        Main m = new Main();
        m.<B>f();
        m.<B>g();
    }

【问题讨论】:

  • “为什么会这样?”什么会发生?您只是告诉我们您预期会发生什么。
  • interfaces 在 Java 中不能有实例变量。它们只能有常量值(即final 实例变量),但将常量放入interface 被认为是一种不好的做法。
  • 这段代码无法编译,是你的问题吗?
  • @Cicada:实际上,代码确实可以编译。
  • 接口不应包含非 const 变量

标签: java generics interface polymorphism


【解决方案1】:

在您的代码中,任何扩展/实现A 的类或接口都将继承常量变量n

interface A 的声明实际上变成了这样:

interface A {
    public static final String n = "interface A"; //constant static varible
}

你不能在java中覆盖final变量。

如果你写

System.out.println(B.n);

它将打印“BB”。

您可以找到已回答的类似问题here

【讨论】:

    【解决方案2】:

    你的代码sn-p问题太多了。

    1. 您试图将字段定义到接口中。这是禁止的。接口中只允许使用方法或静态字段。
    2. 您的方法f 未终止。
    3. 不清楚您要做什么。

    我建议您先阅读有关变质的内容。然后尝试在没有泛型的情况下进行一些练习。然后阅读泛型,想想你要做什么,然后用泛型实现第二个练习。然后,如果您仍有问题,请在此处发布,我们将很乐意为您提供帮助。

    祝你好运。

    【讨论】:

    • "这是禁止的。"不,这不是被禁止的。它只是隐式公开的、静态的和最终的。
    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多