Zmienna przyjmująca wartość w zależności od typu generyka

0

Jeśli typ generyczny T extends Numeric wtedy zmienna DEFAULT_VALUE_FOR_NULL powinna przyjąć wartość 0. Jeśli T extends String to wartość "".

Jak to teraz zrobić, by nie zmuszać do przekazywania w konstruktorze tej zmiennej DEFAULT_VALUE...

próbowałem tak, ale nie działa, bo kompilator nie zna jeszcze T:

public class Alg1 <T> implements IAlgorithm1<T>{
	private Optional<T> result;
	private String text;
	final private  IAlgorithm<T> ENGINE;
	final private String SPLITERATOR = "\\s*(<br>|<p>)\\s*"; // new line
	final private String KEY_WORD;
	final private T DEFAULT_VALUE_FOR_NULL;

	public Alg1(String text, IAlgorithm<T> engine, String keyWord) {
		this.text = text;
		this.ENGINE = engine;
		this.KEY_WORD = keyWord;
		if(T instanceof Numeric){
			this.DEFAULT_VALUE_FOR_NULL = 0;
		}
		if(T instanceof String){
			this.DEFAULT_VALUE_FOR_NULL = "";
		}
		init();
//...
	}
1

Niestety, typy generyczne w Javie nie działają w ten sposób :). T nie jest zmienną, więc nie możesz napisać nic w stylu T instanceof, bo instanceof to operator.

Jedyne rozwiązanie Twojego problemu to przekazanie klasy typu T w konstruktorze:

public class Alg1 <T> implements Algorithm1<T>{
    public Alg1(Class<T> type, String text, IAlgorithm<T> engine, String keyWord) {
       if(String.class.isAssignableFrom(type)) {
          // ...
       }
    }
}

Alg1<String> alg1 = new Alg1(String.class, "dsfsfsd", engine, "dsfsdf");

(jakby coś nie działało, to napisz type.isAssignableFrom(String.class) - ciągle mi się myli kolejność tego zapisu, a nie mam akurat pod ręką dokumentacji).

0

a może da się jakoś to zrobić w Optionalu? Bo generalnie tej zmiennej DEFAULT_... potrzebuję do wstawienia tutaj:

orElse(DEFAULT_VALUE_FOR_NULL)
dla liczb 0 dla tekstu chcę ""

0

Co rozumiesz przez "zrobienie w Optionalu"? Co w tym optionalu chciałbyś przekazać?

0

Mam w tej klasie taką metodę:

	@Override
	public T getResult() {
		return result.orElse(DEFAULT_VALUE_FOR_NULL);
	}

i może się da zrobić jakoś by ten Optional<T> result sam sobie ustawiał wartość DEFAULT_VALUE_FOR_NULL w zależności czy numeryczna czy tekstowa?

0

To musisz po prostu przenieść tego IF-a z if(String.class.isAssignableFrom(type)), to będzie Ci "sam" ustawiał. Skąd niby inaczej Optional miałby umieć to "sam" zrobić?

0

OK, no nie wiem liczyłem na to, że jest jakaś metoda z Optionala co sama se zaślepia nule albo coś co można wpisać jako arugument orElse()

0

A skąd by ona miała wiedzieć, CZYM tego nulla zaślepić, jak tam wszędzie jest typ generyczny, który może być absolutnie dowolnym typem Javy, np. interfejsem? :)

0

no mogła by się sama domyślić, że jak daję Intigera to może zaśleppić mi 0

1

A co by zrobiła, jakbyś zdefiniował sobie Optional<SomeInterface>? Generalnie tak się nie projektuje API i nawet w Twoim przypadku uważam, że lepszym pomysłem byłoby przekazanie domyślnej wartości po prostu przez konstruktor.

0

wtedy null, ale te Javowe typy to mogła obsługiwać... no zrobię jednak przez konstruktor domyślną wartość...

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