Unchecked cast problem

ε祈祈猫儿з 提交于 2019-12-11 12:52:24

问题


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

回答1:


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



回答2:


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.




回答3:


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.



来源:https://stackoverflow.com/questions/4114217/unchecked-cast-problem

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!