Avatar billede jtjansen Nybegynder
01. oktober 2008 - 23:11 Der er 9 kommentarer

Generics og warnings

Hvordan undgår jeg compiler warning på dette her?

import java.util.*;
import java.lang.*;

public class TestGenerics 
{
    public static ArrayList gl = new ArrayList();
   
    public static void add(ArrayList l)
    {
        gl.addAll(l);
    }
   
    public static void main(String args[])
    {
        ArrayList<String> l = new ArrayList<String>();
        l.add("1");
        l.add("2");
        TestGenerics.add(l);   
       
        ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(new Integer(1));       
        l2.add(new Integer(2));               
        TestGenerics.add(l2);
    }
}
Avatar billede jtjansen Nybegynder
01. oktober 2008 - 23:34 #1
ikke med annotation
Avatar billede arne_v Ekspert
02. oktober 2008 - 00:53 #2
prøv:

import java.util.*;

public class TestGenerics {
    public static ArrayList<Object> gl = new ArrayList<Object>();
    public static <T> void add(ArrayList<T> l) {
        gl.addAll(l);
    }
    public static void main(String args[]) {
        ArrayList<String> l = new ArrayList<String>();
        l.add("A");
        l.add("B");
        TestGenerics.add(l); 
        ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(1);     
        l2.add(2);             
        TestGenerics.add(l2);
        System.out.println(gl);
    }
}
Avatar billede arne_v Ekspert
02. oktober 2008 - 01:49 #3
Jeg er en lille bitte smule skeptisk overfor konstruktionen dog.
Avatar billede jtjansen Nybegynder
02. oktober 2008 - 21:44 #4
Hej Arne. Tak for dit svar. Her komme forklaringen på hvad jeg skal bruge det til. Jeg har lavet min egen ListModel som nu skal skrives om til generics (eller bare undgå at smide warnings). Min eksempelkode i spørgsmplet var ikke helt godt nok. Her er koden, og hvordan undgår jeg warnings på dette?

import java.util.*;
import java.lang.*;
import javax.swing.*;
import javax.swing.event.*;

public class TestGenerics implements ListModel
{
    public ArrayList gl = new ArrayList();
   
    public void setListData(ArrayList l)
    {
        gl = l;
    }

    public void add(Object o)
    {
        gl.add(0);
    }   

    public Object getElementAt(int index)
    {
        return gl.get(index);
    }       

    public int getSize()
    {
        return gl.size();
    }

    public void addListDataListener(ListDataListener l) {}
    public void removeListDataListener(ListDataListener l) {}
               
    public static void main(String args[])
    {
        TestGenerics tg = new TestGenerics();
        ArrayList<String> l = new ArrayList<String>();
        l.add("1");
        l.add("2");
        tg.setListData(l);   
       
        ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(new Integer(1));       
        l2.add(new Integer(2));               
        tg.setListData(l2);
    }
}
Avatar billede arne_v Ekspert
02. oktober 2008 - 22:00 #5
Maaske:


import java.util.*;
import javax.swing.*;
import javax.swing.event.*;

public class TestGenerics implements ListModel {
    public ArrayList<Object> gl = new ArrayList<Object>();
    public <T> void setListData(ArrayList<T> l) {
        gl = new ArrayList<Object>();
        gl.addAll(l);
    }
    public void add(Object o) {
        gl.add(o);
    } 
    public Object getElementAt(int index) {
        return gl.get(index);
    }     
    public int getSize(){
        return gl.size();
    }
    public void addListDataListener(ListDataListener l) {}
    public void removeListDataListener(ListDataListener l) {}
    public static void main(String args[]) {
        TestGenerics tg = new TestGenerics();
        ArrayList<String> l = new ArrayList<String>();
        l.add("A");
        l.add("B");
        tg.setListData(l); 
        ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(1);     
        l2.add(2);             
        tg.setListData(l2);
    }
}
Avatar billede arne_v Ekspert
02. oktober 2008 - 22:12 #6
Bemaek at det laver en kopi af listen.

Vil du ikke det skal du over i noget a la:

    public ArrayList<? extends Object> gl;
    public void setListData(ArrayList<? extends Object> l) {
        gl = l;
    }

men saa skal du finde en anden loesning paa add metoden !
Avatar billede jtjansen Nybegynder
02. oktober 2008 - 22:15 #7
men jeg vil egentlig gerne undgå den kopiering.
Avatar billede jtjansen Nybegynder
02. oktober 2008 - 22:16 #8
Jeg undre mig mere og mere over den warning. Følgende giver ingen warning, men tilføjer man add-metoden så får jeg warning. Hvorfor skal en add til en ikke-generisk liste giver en warning, og hvordan undgår jeg det?

import java.util.*;
import javax.swing.*;
import javax.swing.event.*;

public class TestGenerics implements ListModel {
    public ArrayList gl = new ArrayList();
    public void setListData(ArrayList l) {
        gl = l;
    }
    /*
    public void add(Object o) {
        gl.add(o);
    }  */
    public Object getElementAt(int index) {
        return gl.get(index);
    }     
    public int getSize(){
        return gl.size();
    }
    public void addListDataListener(ListDataListener l) {}
    public void removeListDataListener(ListDataListener l) {}
    public static void main(String args[]) {
        TestGenerics tg = new TestGenerics();
        ArrayList<String> l = new ArrayList<String>();
        l.add("A");
        l.add("B");
        tg.setListData(l); 
        ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(1);     
        l2.add(2);             
        tg.setListData(l2);
    }
}
Avatar billede arne_v Ekspert
04. oktober 2008 - 01:39 #9
Det er ikke type safe at adde til en ikke generisk ArrayList.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester