0
public class method
{
    private static class Foo
    {
        public void hello() { System.out.println("Foo"); }
    }

    private static class Bar
    {
        public void hello() { System.out.println("Bar"); }
    }

    private static <T> void hello(T typ)
    {
        typ.hello();
    }

    public static void main(String args[])
    {
        Foo foo = new Foo();
        Bar bar = new Bar();
        hello(foo);
        hello(bar);
    }
}

我在这里查看了有关泛型的其他问题,但是尽管我在那里看到了所有内容并将其应用于我编写的代码,但我的 Java 代码仍然存在问题。我已经解决了上面代码中遇到的问题。当我尝试编译上面的 codd 时,出现以下错误:

method.java:15: error: cannot find symbol
        typ.hello();
           ^
  symbol:   method hello()
  location: variable typ of type T
  where T is a type-variable:
    T extends Object declared in method <T>hello(T)

可能是我正在使用通用的东西做一些他们没有设计做的事情,但根据我对文档的理解,这应该有效。当然,我阅读文档的想法是我可以做这样的事情,这当然可能影响了我对它的理解。

谢谢

4

4 回答 4

4

这是你的问题:

private static <T> void hello(T typ)

T 不扩展任何实现名为“Hello”的方法的东西。

相反,将其替换为

 private static <T extends ClassThatHasHello> void hello(T type)

和班级:

 public class ClassThatHasHello {
      public void hello() { }
 }
于 2013-05-17T20:51:00.557 回答
1

您定义T为对象的子类型。没有任何类型限制。对象没有hello()方法

Foo and Bar您可以为Then创建一个接口或超类型<T extends SuperType>

于 2013-05-17T20:53:15.973 回答
0

您需要使用interface. 这有效:

private interface Hello {
  public void hello();
}

private static class Foo implements Hello {
  @Override
  public void hello() {
    System.out.println("Foo");
  }
}

private static class Bar implements Hello  {
  @Override
  public void hello() {
    System.out.println("Bar");
  }
}

private static <T extends Hello> void hello(T typ) {
  typ.hello();
}

public static void main(String args[]) {
  Foo foo = new Foo();
  Bar bar = new Bar();
  hello(foo);
  hello(bar);
}
于 2013-05-17T20:57:35.800 回答
-2

您正在使用泛型,并且您正在尝试调用类型 T 的 hello 方法,但您不知道那是什么类型。如果您确定它有 hello 方法,请使用强制转换

于 2013-05-17T20:51:14.260 回答