Metoda generyczna - The operator is undefined...

Metoda generyczna - The operator is undefined...
KV
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:59
0

Hej,

Chcę napisać metodę i nie wiem dlaczego zmienna result nie przyjmuje zwykłych operatorów arytmetycznych.

Kopiuj
public static <T> T multiply(T a, T b){
		
		T result =  a * b; //The operator * is undefined for the argument type T
		
		return result;
		
	}

Co muszę tutaj zmienić?

Pozdrawiam

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
2
kviatek napisał(a):

Co muszę tutaj zmienić?

Język programowania.
W obecnej Javie nie da się tego w rozsądny sposób zrobić.

Musiałbyś wprowadzić coś w stylu własnego typu Number/arithmetic z operacją multiply.
O! ktoś już miał ten problem:
https://stackoverflow.com/questions/27107043/java-multiply-generic-number-without-changing-its-type


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
wojciechmaciejewski
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 lata
  • Postów:560
0

Java nie obsługuje przeciążenia operatorów, w związku z czym nie wie co to za metod * dla typu T.

zrób sobie interjes

Kopiuj
interface Multiplay<T>{
  T multiplay(T a, T b)
}

i zaimplementuj w swojej klasie tam gdzie będziesz potrzebował

Shalom
multiply ;)
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Co to w ogóle teraz niby znaczy co napisałeś? Masz jakiś dowolny typ T i wesoło próbujesz wykonać operacje a= b*c która jest TxT->T i logiczne że kompilator protestuje, bo dla większości typów które mogą być podstawione pod T taka operacja nie jest możliwa do wykonania. W Javie zresztą nie można sobie przeładować operatorów więc są one zdefiniowane tylko dla konkretnych kilku klas i nijak nie zadziałają ci z generykami.
A jeśli zrobisz wlasny interfejs ze zwykła metodą to i tak musisz zawęzić T do niego dając <T extends Cośtam>


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0

Z tą logicznością, że kompilator protestuje - to jest logiczne dla Javy. Na razie. Kto wie co kiedyś będzie.
Ale inne kompilatory sobie czasem radzą. Taki haskell "łyka jak konik dropsa":

Kopiuj
let miul x y = x * y
-- i taki typ wychodzi
miul :: Num a => a -> a -> a

jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
Shalom
@jarekr000000 to trochę inna bajka bo haskell polega na inferencji typów a nie na statycznej typizacji. Jeśli spróbujesz teraz użyć tego na niepoprawnych typach (dla których nie ma tego operatora) to haskell też zaprotestuje ;]
0

Hej,

Dzięki za odpowiedzi.
Dla Was to nie dziwne, dla mnie niestety jeszcze nie, bo 1,5 miesiąca się uczę.

Pozdrawiam

KV
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 7 lat
  • Postów:59
0

Przepraszam, myślałem, że jestem zalogowany.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.