Jump to content

Recommended Posts

Posted

Não utilizas genéricos com arrays.

ArrayList[] GRAFO = new ArrayList[N];

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Posted

Não utilizas genéricos com arrays.

ArrayList[] GRAFO = new ArrayList[N];

Pois, eu fiz isso mas dava-me um warning, mas já resolvi, tem que colocar depois o seguinte:

@SuppressWarnings("unchecked")
Posted

Pois, eu fiz isso mas dava-me um warning, mas já resolvi, tem que colocar depois o seguinte:

@SuppressWarnings("unchecked")

Resolver os warnings não é suprimindo-os, é resolvendo-os [sarcasm] Eu sei eu sei... fazer as coisas como deve ser dá trabalho e é uma chatice de todo o tamanho... [/sarcasm] mas os warnings têm sempre razão, por alguma razão eles existem e existem para evitar os erros.

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted

Resolver os warnings não é suprimindo-os, é resolvendo-os [sarcasm] Eu sei eu sei... fazer as coisas como deve ser dá trabalho e é uma chatice de todo o tamanho... [/sarcasm] mas os warnings têm sempre razão, por alguma razão eles existem e existem para evitar os erros.

O problema é que não sei como resolve-lo xD

De qualquer maneira obrigado.

Topic solved.

Posted

Há alturas em que não dá mesmo para fugir aos warnings... e uns são mais graves que outros:

ArrayList[] GRAFO = new ArrayList[N];

Aqui não defines o tipo do arrayList, todas as tuas operações serão sobre o Object e não String. Obrigas o código que utiliza essa variavel a "saber" qual o tipo associado (neste caso String é o que pretendes). Esse código, pelo menos na minha máquina não gera warnings, mas considero-o mais "perigoso" do que a alternativa (ainda que com warnings).

O que gera warnings efectivamente:

ArrayList<String>[] grafo = new ArrayList[2]; // warning: [unchecked] unchecked conversion

ArrayList<String>[] grafo2 = (ArrayList<String>[]) Array.newInstance(ArrayList.class, 2); // warning: [unchecked] unchecked cast

Ainda assim, o warning diz respeito apenas ao assignment, o código que usar qualquer uma das variaveis já vai ser obrigado a respeitar o tipo definido ArrayList<String>[], pelo menos em compile-time e se tiveres algum cuidado, pois como não podes efectivamente declarar arrays com tipos genéricos, internamente terás sempre ArrayList[], como tal, arriscas-te a erros de runtime se não fores cuidadoso.

por exemplo:

ArrayList<String>[] grafo2 = (ArrayList<String>[]) Array.newInstance(ArrayList.class, 1); //warning: [unchecked] unchecked cast               
        
        ArrayList b[] = grafo2; 
                
        b[0] = new ArrayList<Long>();
        b[0].add(new Long(2)); //  warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.ArrayList
        
        for (ArrayList<String> as : grafo2){
            for (String s : as){
                System.out.println(s);
            }
        }

Compila com os warnings descritos, mas em runtime : java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String.

Ok, o que fazer entao?

Na minha opinião, deve ser feito um uso muito cuidadoso da anotação SuppressWarnings, limitando o seu scope ao máximo, neste caso á inicialização do array:

@SuppressWarnings("unchecked")
        ArrayList<String>[] grafo2 = (ArrayList<String>[]) Array.newInstance(ArrayList.class, 1);                
        
        grafo2[0] = new ArrayList<String>(); // no warnings, como seria de esperar.
        grafo2[0].add("asdasd"); // no warnings

        ArrayList b[] = grafo2;
                
        b[0] = new ArrayList<Long>();

        // apenas um warning, e este sim é grave. já te dá a entender que estás a fazer algo que não devias,
       // pois se estivesses a usar a var grafo2 (q é parameterizada) não terias warnings nenhums.
       // e sabes que pode dar origem a runtime exceptions. que é o caso.
        b[0].add(new Long(2)); // warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.ArrayList
        
        for (ArrayList<String> as : grafo2){
            for (String s : as){
                System.out.println(s);
            }
        }

Espero ter servido de alguma ajuda.

Cumprimentos,

José Rodrigues

Posted

...

Wow what?!?!?

Então isto não funciona sem warnings?

ArrayList<String>[] arrayAlist = new ArrayList[15];
arrayAlist[0] = new ArrayList<String>();

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Posted

Wow what?!?!?

Então isto não funciona sem warnings?

ArrayList<String>[] arrayAlist = new ArrayList[15];
arrayAlist[0] = new ArrayList<String>();

Por aqui dá o mesmo que tinha colocado no post :

ArrayList<String>[] grafo = new ArrayList[2]; // warning: [unchecked] unchecked conversion

ArrayList<String>[] grafo2 = (ArrayList<String>[]) Array.newInstance(ArrayList.class, 2); // warning: [unchecked] unchecked cast

warning: [unchecked] unchecked conversion

found  : java.util.ArrayList[]

required: java.util.ArrayList<java.lang.String>[]

        ArrayList<String>[] arrayAlist = new ArrayList[15];

Cumprimentos,

José Rodrigues

Posted

Arrayception!  😛

Desculpem, mas tinha mesmo de dizer isto.

Isto porque, saber a composicão do granito, os estágios da evolucão psicológica humana ou as deambulacões do Sartre não indicam puto sobre as competências de alguém num determinado campo específico e muito menos sobre o que as pessoas gostam de fazer ou a sua capacidade de aprendizagem. - bubulindo, 15 de Fevereiro de 2013 - 02:01

Posted

@joseerodrigues Oh... Já percebi, é um bug do java6. Já nem me lembrava.

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.