如何使用Java中的泛型返回数字?

时间:2013-05-24 19:55:35

标签: java generics

我有一个简单的类,如下所示,但我有一个关于使用泛型返回值的问题。

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 。我怎样才能正确编码呢?

4 个答案:

答案 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)

0int,泛型仅适用于对象引用(不是基本类型)。修复代码的方法是返回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<>();

换句话说:您需要特定类型的特定行为,因此您无法以通用方式执行此操作。