开发者

Unchecked cast problem

开发者 https://www.devze.com 2023-01-23 15:37 出处:网络
Hey, I\'m trying to implement the ShellSort algorithm and now I got a problem: warning: [unchecked] unchecked cast

Hey, I'm trying to implement the ShellSort algorithm and now I got a problem:

warning: [unchecked] unchecked cast

found : java.util.Vector

required: java.util.Vector<java.lang.Object>

Vector<Object> vcur = (Vector<Object>)currentCols[tcur];

Same with vtmp.

I don't know where the problem is. It would be really great if you could help me. :)

This is my code:

public static Vector<Object> shellSort(Vector<Object> ul) {
    int lcount = ul.size();
    int colcount = 4; // 2^x
    Vector[] currentCols = { ul };
    for(; colcount > 0; colcount = (colcount / 2)) {
        Vector[] tmpCols = new Vector[colcount];
        for(int t1 = 0; t1 < colcount; t1++) {
            tmpCols[t1] = new Vector<Object>();
        }
        int tcur = 0;
        int tcurlvl = 0;
        int ttmp = 0;
        for(int t2 = 0; t2 < lcount; t2++) {
            Vector<Object> vcur = (Vector<Object>)currentCols[tcur];
            Vector<Object> vtmp = (Vector<Object>)tmpCols[ttmp];
            vtmp.addElement((Object)开发者_开发知识库vcur.elementAt(tcurlvl));

            // step to next place
            tcur++;
            ttmp++;
            if(tcur == currentCols.length) { tcur = 0; tcurlvl++; }
            if(ttmp == tmpCols.length) { ttmp = 0; }
        }
    }
    return ul;
}


I believe the problem here is type erasure. At run-time, Vector is simply Vector. For example:

Vector<String> stuff = new Vector<String>()
Vector<Object> objects = (Vector<Object>)stuff

It will compile, but fail at runtime when you try to put an Int into objects.


This still won't fix the issue (you code doesn't work... never sorts) but it is updated to use List instead of Vector (Vector is obsolete, cannot be deprecated since official APIs depend on it). Unless you need the synchronization built into Vector use List/ArrayList instead.

I also changed the array creation to be closer to generic (cannot truly do generic array creation).

Finally I made the whole method generic so that it can work typesafely with things other than Object (so a List or List, etc...).

It still gives warnings though. Perhaps you should work on getting the code to work properly before you worry about this particular warning (normally I would not suggest that, but with generics that can sometimes be a better way to do it).

public static <T> List<T> shellSort(List<T> ul) 
{
    int lcount = ul.size();
    int colcount = 4; // 2^x

    List<T>[] currentCols = (List<T>[])Array.newInstance(List.class, 1);
    currentCols[0] = ul;

    for(; colcount > 0; colcount = (colcount / 2))
    {
        List<T>[] tmpCols = (List<T>[])Array.newInstance(List.class, colcount);

        for(int t1 = 0; t1 < colcount; t1++)
        {
            tmpCols[t1] = new ArrayList<T>();
        }

        int tcur = 0;
        int tcurlvl = 0;
        int ttmp = 0;

        for(int t2 = 0; t2 < lcount; t2++)
        {
            List<T> vcur = currentCols[tcur];
            List<T> vtmp = tmpCols[ttmp];
            vtmp.add(vcur.get(tcurlvl));

            // step to next place
            tcur++;
            ttmp++;
            if(tcur == currentCols.length) { tcur = 0; tcurlvl++; }
            if(ttmp == tmpCols.length) { ttmp = 0; }
        }
    }

    return ul;
}


Why are you declaring currentCols?

Vector[] currentCols = { ul };

This array always contains one element - the ul. Just replace currentCols[..] with ul and the error will also go away.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号