Z typami generycznymi w Java niby jest wszystko jasne. Przyzwyczaiłem się do ograniczeń typu będącego parametrem czy do metaznaków w typach generycznych. Jednak na jednym ze spotkań Lublin JUG, Marek "Lasu" Kozieł rozwalił mnie przykładem zawierającym coś w stylu
<T extends I1 & I2>Nawet przez google ciężko było coś dojrzeć. Chociaż znalazłem jeszcze bardziej pojechane przykłady z metaznakami czy wyjaśnienie dosyć niezwykłej deklaracji enum'ów. Ostatecznie na pomoc przyszła specyfikacja języka Java a dokładniej podrozdział 4.4 wspominający o additional bounds of type variable czyli dodatkowych ograniczeniach parametru będącego typem. Tłumacząc z języka angielsko-java-specyfikacyjnego na nasze: wyrażenie
<T extends S & I >oznacza, iż typ T musi rozszerzać klasę S lub też implementować interfejs S ... oraz implementować interfejs I ...
<T extends S & I & I2 >... oraz interfejs I2 itd. Napisałem sobie nawet prostą grę RPG ilustrującą ten trik:
package generics;
public class JustAnotherRpgGame {
public static void main(String[] args) {
SkillfullWizard wizard = new SkillfullWizard();
makeAdventure( wizard );
}
public static <T extends Runnable & Caster> void makeAdventure(T t) {
System.out.println("I've found a dragon ...");
t.doMagic();
System.out.println("... and now ...");
t.run();
}
}
interface Caster {
void doMagic();
}
class SkillfullWizard implements Caster, Runnable {
public void doMagic() {
System.out.println("Cast Time Stop and Abi Dalzim's Horrid Wilting.");
}
public void run() {
System.out.println("Running to next challenge - meeting with Nizidramanii'yt.");
}
}
Kto wie może jak wprowadzę nieliniowość akcji, questy poboczne, rewelacyjny klimat i poczucie humoru to wyjdzie kolejna odsłona Baldur's Gate :D Aha no i OOP trzeba by poprawić :)

0 komentarze:
Prześlij komentarz