9

我有一个像下面这样的简单类,但我有一个关于使用泛型返回值的问题。

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
    }
}

当 i < list.size() 不为null时,我必须得到 0 (或 0.0 - 它取决于 T 的值)。我该如何正确编码才能做到这一点?

4

4 回答 4

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;
    }
}

等等

一个很好的特性是它可以返回任何默认值,而不仅仅是零……同样的原则适用于任何类型的对象,而不仅仅是数字。

于 2013-05-24T20:02:30.863 回答
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;
    }
}
于 2013-05-24T20:07:30.960 回答
2

0is anint并且泛型仅适用于对象引用(不是原始类型)。一种修复代码的方法是返回null

public T get(int i){
    if(i <list.size()) {
        return list.get(i);
    }
    return null; // Problem solved
}

当 i < list.size() 不是时,我必须得到 0(或 0.0 - 它取决于 T)null

考虑到向用户显示 0的演示主题必须由显示数据的类/方法处理,而不是由这些方法处理。这意味着,当您必须返回对象引用时,无法返回 0

于 2013-05-24T19:57:59.790 回答
2

如果不为所有类型创建子类并且不参数化和显式检查类型,您就无法做到这一点。这很正常:我可以创建一个类型

public StrictlyPositiveInteger implements Number

甚至没有值 0,然后执行

Box<StrictlyPositiveInteger> box = new Box<>();

换句话说:您想要特定类型的特定行为,因此您不能以通用方式进行。

于 2013-05-24T23:34:46.163 回答