使用接口时,为什么多态在泛型方法中不起作用?

时间:2012-06-17 08:28:04

标签: java generics interface polymorphism

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

在这段代码中,我原本期望方法f打印出“BB”而不是“接口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();
    }

2 个答案:

答案 0 :(得分:4)

在您的代码中,任何扩展/实现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

答案 1 :(得分:0)

您的代码段中存在太多问题。

  1. 您尝试将字段定义到接口中。这是被禁止的。接口中只允许使用方法或静态字段。
  2. 您的方法f未终止。
  3. 目前还不清楚你想做什么。
  4. 我建议你先阅读有关变质的内容。然后尝试在没有泛型的情况下实施一些练习。然后阅读关于泛型,想想你要做什么,并用泛型实现第二个练习。如果您仍然有问题在这里发布,我们将很乐意为您提供帮助。

    祝你好运。