我是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();
}
仍然是错误的。
答案 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;
}
}
希望这有帮助!