Java Generic Wildcard loswerden?

Hendoul

Commander
Registriert
Apr. 2008
Beiträge
2.049
Hi :)

Ich schau mir grad ein paar Sonar-Issues an in unserem Projekt und da bin ich über folgende Regel gestolpert:
Remove usage of generic wildcard type
Java:
public abstract class A {
    protected abstract Blub<?> getBlub();
}

Die Overrides sehen so aus:

Java:
public class X<T extends BaseStuff> extends A {
  
    @Override
    public Blub<?> getBlub() {
        if(x == true){
            return new Blub<List<Foo<Bar>>>(){};
        } else if (y == true){
            return new Blub<List<Foo<Biz>>>(){};
        }
    }
}


class Y extends A {
  
    @Override
    protected Blub<List<Foo<Bar>>> getBlub() {
        return new Blub<>(){};
    }
}

class Bar extends BaseStuff {}
class Biz extends BaseStuff {}
class Blub<T>{}

Durch was könnte ich denn die generic wild card bei der abstract methode ersetzen?
 
Zuletzt bearbeitet:
Naja, nur durch den Supertypen aller moeglichen Dinge die die Methode verarbeiten koennen soll. Dein Beispiel ist leider zu fiktiv
 
Ohne Kontext kann man diese Frage unmöglich beantworten. Prinzipiell: Mit Interfaces und Vererbung.
 
Habe es erweitert. Reichen die Informationen? Falls nicht, bitte sagen was noch fehlt :)
 
Hendoul schrieb:
Reichen die Informationen?
Nein.
Hendoul schrieb:
Falls nicht, bitte sagen was noch fehlt
Alle involvierten Klassen.


So wie ich das sehe, willst du einfach gerade eine Klasse bauen, die eine Methode mit beliebigen Rückgabewert hat. Falls das stimmt, wieso nicht einfach Object? Das ist genauso unsauber.
 
Zuletzt bearbeitet:
Der Rückgabewert ist ja immer <List<Foo<etwasDasBaseStuffExtended>>>

Daher dachte ich, ich könnte folgendes verwenden:

Code:
public abstract class A {
    protected abstract Blub<List<Foo<? extends BaseStuff>>> getBlub();
}

Aber das funktioniert nicht.

Required:
Blub<List<Foo<? extends BaseStuff>>>
Provided:
Blub<List<Foo<Bar>>>


Obwohl ja Bar von BaseStuff extended?
 
Listen davon sind unterschiedlich, wie auch List<String> kein Untertyp von List<Object> ist. Vor die Liste muss auch noch "? extends".
 
Zurück
Oben