Programm funktioniert aber unsafe operations?

jhamra

Mitglied
Hey,

ich hab mal probiert, einen generischen Ringbuffer zu programmieren. Also man kann die Größe und den jeweiligen Typ mittels Generics festlegen. Es funktioniert auch soweit ganz gut, aber der

Compiler beschwert sich: VariablerClipper.java uses unchecked or unsafe operations.

Hier mal der Code:

Java:
public class VariablerClipper<E>{
  
    private int N=0;
    private int size;
    private Object[] array;
  
    public VariablerClipper(int size){
        this.size = size;
        array = new Object[size];
    }
  
    public void put(E obj){
        array[N%size] = obj;
        N++;
    }
  
    public E get(){
        E obj = (E) array[(N-1)%size];
        return obj;
    }
  
    public E get(int i){
        if(i<1||i>size) throw new ArrayIndexOutOfBoundsException("Nicht zwischen 1 und"+size);
        E obj = (E) array[(N-1-i)%size];
        return obj;
    }
  
    public static void main(String[] args){
        VariablerClipper<Integer> x = new VariablerClipper<>(23);
        for(int i = 0; i< 1000; i++)
            x.put(i);
        for(int i = 1; i < 22; i++)
            System.out.println(1+x.get(i));
      
    }
}

Danke schonmal^^
 
Zuletzt bearbeitet von einem Moderator:
hi,
bei Generics ist der Compiler manchmal pingelig. da musst du explizit sagen, dass das was du da machst wirklich sein soll. das machst du mit
Code:
@SuppressWarnings("unchecked")
vor einer methodendefinition. ich bin in generics nicht so ganz fit, aber ich würde es mal vor get() und get(int i) probieren, vlt brauchst dus auch bei put
javampir
 
Das Problem liegt konkret in den Methoden "get" sowie "get(int i)". Hier holst du aus einem Object[] ein Element raus und castest dieses ohne Überprüfung. Da liegt meiner Meinung nach auch ein Fehler in deiner Implementierung vor 😉

Mit diesem Code kannst du an die Methode "put" einfach "null" übergeben und sobald du entsprechendes Element rausholen willst knallt es! Dir fehlen hier einfach "null" Checks und Cast Überprüfungen.
 
Da fehlen keine null-checks und da ist auch sonst kein Fehler. Es fehlt wie javampir schon sagt nur der @Suppress#Warnings-Hinweis für den Compiler.
ArrayList arbeitet intern z.B. genau so, wie es der TE hier macht. An dem Ansatz gibts soweit nix auszusetzen.
 

Zurück
Oben