调用泛型类型的方法

时间:2015-11-19 14:22:12

标签: java

我是Java新手。请帮我这个代码。

我正在创建一个带泛型参数的实用程序类。在实用程序类的API中,我调用了一些泛型类型的API。

我假设此类的用户只会传递具有此API(在我的情况下为getInt)的泛型。

public class Utility <DataType> {

   private DataType d;

   public Utility (DataType d_)
   {
       d = d_;
   }

   public int getValue ()
   {
      return d.getInt();
   }
}

请指出我在这里做错了什么。

d.getInt()中的编译错误。无法解析getInt方法。

我添加了抽象界面:

abstract interface DataType {
  public int getInt();
}

仍然是错误的。

3 个答案:

答案 0 :(得分:2)

这可能就是你要找的东西:

您需要一个类型占位符,而不是Utility<DataType>。将其替换为Utility<T>,并将所有DataType替换为T

public class Utility <T extends DataType> {

   private T d;

   public Utility (T d_)
   {
       d = d_;
   }

   public T getValue ()
   {
      return d;
   }
}

答案 1 :(得分:1)

您不能简单地向您的编译器承诺所有派生类中都存在方法。你必须让它存在。你必须定义它。使用继承或接口来实现它。

选项1.继承

使用抽象方法getInt()定义抽象基类。然后,所有非抽象儿童必须实施getInt()

public abstract class DataType() {
    public abstract int getInt();
}

这个班级的孩子会是这样的:

public class MyDataType() extends DataType {
    public int getInt() {
       return 3;
    }
}

选项2.界面

使用方法getInt()定义接口。然后,实现该接口的所有类必须定义方法getInt()。顺便说一句,界面名称通常是形容词。

public interface DataTypeable {
    public int getInt();
}

此接口的实现如下所示:

public class MyDataType() implements DataTypeable {
    public int getInt() {
       return 5;
    }
}

现在,您的Utility类可以使用这样的基类或接口(如果您使用接口路由,则将DataType替换为DataTypeable

public class Utility {

    private DataType d;

    public Utility(DataType d) {
        this.d = d;
    }

    public int getValue() {
        return d.getInt();
    }
}

选项3.泛型加上其他选项之一

为了实际回答问题,以下是如何使用泛型强制它工作。

public class Utility <T extends DataType> { // or <T implements DataTypeable>

    private T d;

    public Utility(T d) {
        this.d = d;
    }

    public int getValue() {
        return d.getInt();
    }
}

但是,在这种情况下,DataType必须是上面提到的其他选项之一。在这里使用泛型毫无意义。

答案 2 :(得分:0)

根据我的理解,您希望将DataType用作通用对象。所以我认为你不必创建接口DataType。只需要像下面的代码一样getValue DataType:

public class Utility<DataType> {

    private DataType d;

    public Utility (DataType d_)
    {
        d = d_;
    }

    public DataType getValue ()
    {
        return d;
    }
}

希望这有帮助!