如何在泛型类中设置随机值

时间:2019-03-23 18:40:51

标签: java generics arraylist

我尝试用随机值填充ArrayLists。 Arraylist可以包含Strings,Integers,Doubles或Chars。创建随机值效果很好,但是我的问题是我无法编写我的insertRandom方法。它应该插入特定的数据类型(例如double,int等)。我在下面描述了我希望我的insertRandom方法要做的事情。 我收到警告“类型缓冲区中的insert(T)方法不适用于arguments(int)。 我用谷歌搜索,但是没有发现/不理解如何将我的值类型转换为T对象,或者如何检查(类似于“ instanceof”的作用),ArrayLists包含哪些数据类型。我已经读过人们在其构造函数中用作参数的类类型,但是我不允许更改其构造函数的参数列表。

public class Buffer <T> {

private ArrayList<T> list;

    // constructor
    public Buffer (int capacity) {
        this.list = new ArrayList<T>();
    }

    // insert items to buffer
    public void insert (T item) {
        list.add(item);
    }

    // insert random values
    public void insertRandom () {

        check if ArrayList is of type String / Integer / Double

        if (ArrayList is-of-type-String) {
           insert("ThisString");
        }
        if (ArrayList is-of-type-Double) {
            insert(3.4);
        }

}

感谢和问候, 帕特里克

3 个答案:

答案 0 :(得分:1)

即使您使用泛型并且 T 是Double,也无法向其中添加 String 。这意味着没有必要检查类的类型。

Buffer<Double> bd = new Buffer(10);
bd.insert(22.9);
bd.insert("string"); // compiler error

我认为这里不需要泛型。您只需要一个Buffer<Object>,因为根据您的要求,您需要添加字符串,整数,双精度数或字符。因此,您甚至不需要进行类型检查。

类似的东西:

Buffer<Object> buff = new Buffer<Object>(10);
buff.insert(22.9);
buff.insert("");
buff.insert(13);

答案 1 :(得分:1)

作为一种选择,您可以向构造函数提供Class对象,并使用insertRandom()方法检查此类,例如:

public class Buffer <T> {

    private final Class<T> type;
    private ArrayList<T> list;

    // constructor
    public Buffer (int capacity, Class<T> type) {
        this.list = new ArrayList<T>();
        this.type = type;
    }

    // insert items to buffer
    public void insert (T item) {
        list.add(item);
    }

    // insert random values
    public void insertRandom () {

//      check if ArrayList is of type String / Integer / Double     
        if (type == String.class) {
           insert((T)"ThisString");
        }

        if (type == Double.class) {
            insert((T)Double.valueOf(3.4));
        }
    }
}

答案 2 :(得分:0)

首先要注意的是,function Obscure(sub_key, sub_value, sentence) { var obscuredSentence = sentence.replace(sub_key, sub_value); for (var count = 1; count < 2; count++) { return Obscure(sub_key, sub_value, sentence); } var obscuredSentence = sub_value + " " + obscuredSentence + " " + sub_value; return obscuredSentence; } console.log(Obscure("the", "the goat", "I want the money")); //"RangeError: Maximum call stack size exceeded (line 2 in function Obscure)"不能使用像int这样的基元。相反,您必须使用相应的类。在这种情况下,ArrayList。 第二点:我认为您可以通过执行Integer来检查ArrayList包含的类型。