/ / Общ Java код трудно разбираем? [затворен] - java, генерични

Общ код Java е трудно да се разбере? [затворен] - java, генерични

Намерих a Java кодова линия който представлява функционалността на генеричните програми на Java, но аз имам проблеми да го прочета и разбера. Как се разбира следната Java кодова линия?

public <T, F> ContractValidator<T extends Contract> T validate(Validator<T>, F object)

Отговори:

5 за отговор № 1

Е, мога да преценя някакво объркване от това: генеричните лекарства са счупено, Не мисля, че има счупени, както те, "те нямат смисъл за някой, който познава генерици"; Искам да кажа разбити като в те не събирам, Така че не приемайте това, което казват, на буквална номинална стойност; то само ще ви обърка повече.

Така че нека да започнем с очевидното. Извадете всички генерични лекарства и ние оставаме с възприети сурови видове.

public ContractValidator validate(Validator, Object object)

Премахнах двусмисленото двойно връщане, тъй като няма смисъл. Предполагам, че искат променлива за първия аргумент ...

public ContractValidator validate(Validator validator, Object object) {
return null;
}

Така че това, което имаме, са някои Validator и няколко Object навлизам в това validate метод, а това, което излизаме от него, е ContractValidator.

Това е страхотно, с изключение на това, че можем да потвърдим нещо (теоретично) Validator са обвързани с конкретно нещо за потвърждаване?

public <T extends Contract> ContractValidator validate(Validator<T> validator, Object object) {
return null;
}

Изразът <T extends Contract> го превръща в a обвързан с общите. По-конкретно, това е Горна граница; който и да е Validator типове, които не са въведени с нито един от тях Contract или ____ extends Contract няма да работи в това.

Добре, така че сега ние се качваме някъде - имаме някакъв валидатор, който е изрично задължен да търси само нещо, което или е или е дете на Contract, Не трябваше ContractValidator върне резултат, който съдържа нещо такова?

public <T extends Contract> ContractValidator<T> validate(Validator<T> validator, Object object) {
return null;
}

Сега това е мястото, където не съм съгласен с дизайна. Намерението да отидат за (по някаква причина) е да имат свободен общ тип; вероятно ще ви позволи да потвърдите нещо. Но не знам каква е целта на типа - буквално може да бъде всичко.

Това е извършено чрез писане:

public <T extends Contract, F> ContractValidator<T> validate(Validator<T> validator, F object) {
return null;
}

Сега написах всичко това, за да покажа ефективно, че генеричните лекарства сте разбираемо, при условие, че примерипоказва, че може разумно да компилира и да направи някакъв семантичен смисъл. В по-голямата си част, ако използвате генерични лекарства, ще го правите, защото се опитвате или да създадете някакъв полиморфен метод, или се опитвате да създадете полиморфен контейнер.

Ето голям ресурс относно генеричните лекарства; пътеките на Java никога не са ме правили погрешно по този въпрос.


2 за отговор № 2

Параграфът, в който сте взели този ред код, обяснява, че използването на генерични препарати може да направи кода ви сложен. Целта на тази линия е да покаже колко трудно може да се разбере.

Както и да е, не е предназначен да бъде добър пример за генерични лекарства, а всъщност не мисля, че е правилно.