Jak przypisać nic do generyka?

0

Mam interfejs z metodą foo. W 1 klasie przyjmuje ta metoda argument Stringowy, a w 2 klasie nie przyjmuje żadnych argumentów. Jak to napisać?

Próbowałem np. tak:

public interface MyInterface<T> {
	public void foo(T t);
}
public class MyImplementationClass implements MyInterface<String>{
	
	@Override
	public void foo(String x){
		System.out.println(x);
	}
}
public class MyImplementationClass2 implements MyInterface<null>{ // błąd!

	@Override
	public void foo(){ // błąd!
		System.out.println("R najlepszy");
	}
}
2

Użyj java.lang.Void jako parametryzacji generyka, a jako parametr metody podaj null, bo nie da się zrobić new Void().

Ogólnie konstrukcja wygląda jednak dziwacznie. Niespecjalnie też jestem w stanie skojarzyć jakikolwiek język który oferowałby abstrakcję na ilość parametrów dla metody. Można użyć różnego rozmiaru krotek, heterogenicznych list, etc ale taka krotka to dalej przecież jest jeden parametr.

0

Czyli muszę coś takiego?

public class MyImplementationClass2 implements MyInterface<Void>{

	@Override
	public void foo(Void t) {
		System.out.println("R najlepszy");
	}

    public void foo(){
        foo(null);
    }
}
0

Tak. Z drugiej strony używanie nulla samo w sobie jest proszeniem się o problemy. Scala oferuje 'wirtualny' typ Unit (odpowiednik Voida), który czasami przez kompilator jest przepisywany na BoxedUnit, który ma jedną globalnie dostępną instancję. W Javie mógłbyś zrobić coś podobnego i tym samym uniknąć używania nulli.

1

To może tak lepiej?

public interface MyInterface<T> {
    public void foo(T... t);
}
public class MyImplementationClass2 implements MyInterface<Void> { // błąd!

	@Override
	public void foo(Void... t) {
		System.out.println("R najlepszy");
	}
}

.
Wtedy mogę wywowłać new MyImplementationClass2().foo();.

0

No, to jest jakiś pomysł. Wada jest taka, że źle przekazujesz intencję. Jeśli ktoś zobaczy tę metodę to zacznie się zastanawiać co się stanie jak przekażesz więcej niż jeden parametr.

Alternatywnie można też użyć Optional ale to nieco rozdmuchałoby kod.

0

Wrzucam tak o, bo problem z konfiguracją githuba mam.
Zamiast IAgePattern i IContractType chcę mieć IPattern.

1 użytkowników online, w tym zalogowanych: 0, gości: 1