piątek, 1 maja 2009

Ddodatkowe ograniczenia typów generycznych czyli Baldur's Gate III

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: