我有一个简单的类,如下所示,但我有一个关于使用泛型返回值的问题。
import java.util.ArrayList;
public class Box<T extends Number> {
private ArrayList<T> list;
public Box(){
list = new ArrayList<T>();
}
public T get(int i){
if(i <list.size())
return list.get(i);
else
return 0; // Problem
}
}
当 必须得到0(或0.0 - 它取决于T的值) list.size()不是 null 。我怎样才能正确编码呢?
答案 0 :(得分:9)
如果你确实想要默认返回0,你可以这样做:
public abstract class Box<T extends Number> {
private List<T> list;
public Box(){
list = new ArrayList<T>();
}
public T get(int i){
if(i <list.size())
return list.get(i);
else
return getDefault();
}
protected abstract T getDefault();
}
然后为您要支持的每个Number子类型实现一个实现,例如
public class IntegerBox extends Box<Integer> {
@Override
protected Integer getDefault() {
return 0;
}
}
和
public class DoubleBox extends Box<Double> {
@Override
protected Double getDefault() {
return 0D;
}
}
等
这个的一个很好的特性是它可以返回任何默认值,而不仅仅是零...并且相同的原理适用于任何类型的Object,而不仅仅是Numbers。
答案 1 :(得分:9)
如果你真的需要你的Box
返回零或默认值,当你的get找不到匹配时,你可以有一个构造函数参数用于零或默认的类型T.
然后在get
方法中返回该默认值。
示例:
public class Box<T extends Number> {
private ArrayList<T> list;
private T defaultValue;
public Box( T defaultValue){
list = new ArrayList<T>();
this.defaultValue = defaultValue;
}
public T get(int i){
if(i <list.size())
return list.get(i);
else
return defaultValue;
}
}
答案 2 :(得分:2)
0
是int
,泛型仅适用于对象引用(不是基本类型)。修复代码的方法是返回null
。
public T get(int i){
if(i <list.size()) {
return list.get(i);
}
return null; // Problem solved
}
当 必须得到0(或0.0 - 它取决于T) list.size()不是null
考虑到显示0到用户的演示文稿主题必须由显示数据的类/方法处理,而不是由这些方法处理。这意味着,当您必须返回对象引用时,无法返回0。
答案 3 :(得分:2)
如果没有为所有类型创建子类并且没有参数化和显式检查类型,则不能这样做。这是正常的:我可以创建一个类型
public StrictlyPositiveInteger implements Number
甚至没有值0,然后执行
Box<StrictlyPositiveInteger> box = new Box<>();
换句话说:您需要特定类型的特定行为,因此您无法以通用方式执行此操作。