0

我试图了解泛型的工作原理并编写了一种方法来测试它。

我创建了 Object - Drink 及其子对象 Coffee... 并定义了一个通用方法 go1() 来调用这两个对象的 sip() 方法...

我在 Eclipse 中运行并得到一个错误 - 说明方法 sip() 对于类型 V 是未定义的。

有人可以解释这是如何处理的吗?

class Drink{
    public void sip(){
        System.out.println("Im Drink method");
    }
}

class Coffee extends Drink{
    public void sip(){
        System.out.println("Im Coffee method");
    }

}

public class test{

    public static <V> V go1(V o){
        o.sip();

    }

public static <V> void go(V v){
        System.out.println(v.hashCode());
    }

    public static void main(String[] args) {
        Drink s1 = new Drink();
        go1(s1);

            int i = 10;
        String j ="test";
        go(i);
        go(j);

    }
}
4

4 回答 4

3

只需将边界添加到类型参数:

public static <V extends Drink> void go1(V o){
    o.sip();
}

使用类型参数绑定,您可以访问绑定的非静态方法 -Drink在这种情况下,使用该类型参数的引用。

编辑后:

对于传递StringInteger您的方法,您可以考虑哪个公共上限适合两者。String和的常见超类型Integer是:

所以,你可以有三种界限:

  • <V extends Object>
  • <V extends Serializable>
  • <V extends Comparable<V>>

所以你只需修改你的go()方法,如:

public static <V extends Object> void go(V v){
    System.out.println(v.hashCode());
}

参考:

于 2013-10-02T14:40:31.383 回答
1

问题是 plain<V>不能被理解为 aDrink而是作为 generic Object。您需要将泛型绑定到您的Drink类,因此将泛型声明为<V extends Drink>.

更多信息:通用方法和有界类型参数

于 2013-10-02T14:40:50.113 回答
1

编译器根据调用它们的类型决定方法调用是否有效。你有

public static <V> V go1(V o){
    o.sip();
}

butV不是有界类型,因此编译器只能确定它至少是 type ObjectObject没有sip()方法。你需要绑定你的类型

public static <V extends Drink> V go1(V o){
    o.sip();
}

这样编译器就知道它V至少是 type DrinkDrinksip()方法。

于 2013-10-02T14:42:46.127 回答
1

只是为了帮助你的理解..

鉴于您的总体目标是加深您对泛型的理解,我只想指出,简单的接口或超类对象引用将是解决您的问题的更简单的解决方案。IE:

public void go1(Drink d)
{
    d.sip();
}

一个更经典的泛型示例

假设您有一个对象,Pair. Pair 需要能够在 Java 中容纳两个任何东西,所以你将这两个东西做成 type Object。这意味着什么?这意味着您总是Object在和所需的类型之间进行转换。所以你会怎么做?你使用泛型。

public class Pair<F,S>
{
     F first;
     S second;

     public Pair(F first, S second)
     { 
          this.first = first;
          this.second = second;
     }
}

现在不必强制转换,您只需声明:

Pair<Integer, String> pair = new Pair<Integer, String>(10, "Ten");
于 2013-10-02T14:49:53.793 回答