INF1010 21. februar 2013 Grensesnittet Comparable<T> Stein Michael Storleer Institutt for Informatikk Universitetet i Oslo
Interface med parametre interface Utkledd <T> { // T er klassen jeg er utkledd som T utkleddsom(); class VanligHund { class KarnevalsHund<U> extends VanligHund implements Utkledd <U> { U likner; // peker til en jeg er utkledd som KarnevaldsHund(U forbilde){likner = forbilde; public U utkleddsom(){return likner; class Reinsdyr { ; class Hoved{ public static void main (String[] args) { Reinsdyr dyr = new Reinsdyr(); KarnevalsHund<Reinsdyr> passopp= new KarnevalsHund<Reinsdyr>(dyr); Reinsdyr reinpeker = passopp.utkleddsom(); KanBjeffe likner VanligHund Utkledd<U> KarnevalsHund<U> 2
interface Utkledd <T> { T utkleddsom(); Krav til klasse-parametre Formoe class VanligHund { class Person { String navn = Formoe ; class Sjorover extends Person{ navn class KarnevalsHund<U extends Person> extends VanligHund implements Utkledd<U> U { U likner; // peker til en jeg er utkledd som KarnevalsHund(U forbilde) {likner = forbilde; public U utkleddsom() {return likner; String navntilutkleddsom () { return likner.navn; class Hoved{ public static ti void main (String[] args) { Sjorover rover = new Sjorover(); KarnevalsHund<Sjorover> passopp= new KarnevalsHund<Sjorover>(rover); Sjorover sjopeker = passopp.utkleddsom(); System.out.println(passopp.navnTilUtkleddSom()); t tl ()) VanligHund Utkledd<U> likner KarnevalsHund<U extends Person> 3
Comparable i Java-biblioteket interface Comparable <T> { int compareto (T obj) ; compareto returns a negative, zero or a positive integer as this object is less than, equal to, or greater than the specified object class Bil implements Comparable <Bil> {... class Person implements Comparable <Person> {... class Fly implements Comparable <Bil> {... Men hvem ønsker å sammenligne Fly med Biler? Objekt av klassen Bil Comparable<T> Object compareto(bil b) Bil 4
Finn beste hund Navn: hundehuset class StedTilTaVarePaaBeste < U > { U beste= null; void settinn(u ny) { if( beste== null) else if (beste er dårligere enn ny) U hentbeste() {return beste; class Katt { class Hund { class Person { Type: StedTilTaVarePaaBeste<Hund> void settinn(hund ny) Person hentbest() return beste; Navn: beste StedTilTaVarePaaBeste <Hund> hundehuset = new StedTilTaVarePaaBeste <Hund> ( ); // nytt hundehus; Navn: trofast Navn: passopp Navn: kea 29 poeng public int sammenlign (Hund hnd) 42 poeng public int sammenlign (Hund hnd) 31 poeng public int sammenlign (Hund hnd) 5
Finn beste hund Navn: hundehuset class StedTilTaVarePaaBeste < U > { U beste= null; void settinn(u ny) { if( beste== null) else if (beste.sammenlig(ny) < 0) U hentbeste() {return beste; class Katt { class Hund { class Person { Type: StedTilTaVarePaaBeste<Hund> void settinn(hund ny) Person hentbest() return beste; Navn: beste StedTilTaVarePaaBeste <Hund> hundehuset = new StedTilTaVarePaaBeste <Hund> ( ); // nytt hundehus; Navn: trofast Navn: passopp Navn: kea 29 poeng public int sammenlign (Hund hnd) 42 poeng public int sammenlign (Hund hnd) 31 poeng public int sammenlign (Hund hnd) 6
Finn beste hund Navn: hundehuset class StedTilTaVarePaaBeste < U > { U beste= null; void settinn(u ny) { if( beste== null) else if (beste.compareto(ny) < 0) U hentbeste() {return beste; class Katt { class Hund { class Person { Type: StedTilTaVarePaaBeste<Hund> void settinn(hund ny) Person hentbest() return beste; Navn: beste StedTilTaVarePaaBeste <Hund> hundehuset = new StedTilTaVarePaaBeste <Hund> ( ); // nytt hundehus; Navn: trofast Navn: passopp Navn: kea 29 poeng 42 poeng 31 poeng 7
Finn beste hund Navn: hundehuset class StedTilTaVarePaaBeste < U > { U beste= null; void settinn(u ny) { if( beste== null) else if (beste.compareto(ny) < 0) U hentbeste() {return beste; class Katt { class Hund implements Comparable <Hund>{ class Person { Type: StedTilTaVarePaaBeste<Hund> void settinn(hund ny) Person hentbest() return beste; Navn: beste StedTilTaVarePaaBeste <Hund> hundehuset = new StedTilTaVarePaaBeste <Hund> ( ); // nytt hundehus; Navn: trofast Navn: passopp Navn: kea 29 poeng 42 poeng 31 poeng 8
Finn beste hund extends Navn: hundehuset class StedTilTaVarePaaBeste < U implements Comparable <U>> Type: { StedTilTaVarePaaBeste<Hund> U beste= null; void settinn(u ny) { if( beste== null) void settinn(hund ny) else if (beste.compareto(ny) < 0) U hentbeste() {return beste; Person hentbest() return beste; class Katt { class Hund implements Comparable <Hund>{... se neste side... class Person { Navn: beste StedTilTaVarePaaBeste <Hund> hundehuset = new StedTilTaVarePaaBeste <Hund> ( ); // nytt hundehus; Navn: trofast Navn: passopp Navn: kea 29 poeng 42 poeng 31 poeng 9
class Hund implements Comparable <Hund>{ int poeng; Hund(int png) {poeng= png; { return poeng hnd.poeng; trofast = new Hund(29); passopp = new Hund(42); if (trofast.compareto(passopp) < 0) {... Navn: trofast Navn: passopp 29 poeng Navn: hnd return hnd.poeng - poeng 42 poeng return hnd.poeng - poeng 10
interface Comparable <T> { int compareto (T obj) ; Evas hus Navn: hjem Type: StedTilTaVarePaaBeste<Person> class StedTilTaVarePaaBeste < U extends Comparable <U> > { U beste= null; Navn: ole void settinn(u ny) { if( beste== null) Type: Person else if (beste.compareto(ny) < 0) 17 poeng U hentbeste() {return beste; public int compareto(person prs) class Person implements Comparable <Person> { int poeng; Person (int png) {poeng= png; public int compareto (Person prs) { return poeng - prs.poeng; Navn: per Type: Person void settinn(person ny) if( beste== null) else if (beste.compareto(ny) > 0 Person hentbest() return beste; Navn: beste Type: Person Navn: paal class BrukSted { public static void main (String [ ] args) { StedTilTaVarePaaBeste<Person> hjem= new StedTilTaVarePaaBeste<Person>( ); Person ole = new Person(17); hjem.settinn(ole); Person per = new Person(25); hjem.settinn(per); Person paal= new Person(21); hjem.settinn(paal); Person bestitest = hjem.hentbeste (); System.out.println(bestITest.poeng); 25 poeng public int compareto(person prs) Navn: bestitest Type: Person Type: Person 21 poeng public int compareto(person prs) 11
For de spesielt interesserte class Bil {... // Hvis du absolutt må sammenligne fly og biler: class Fly implements Comparable <Bil> {... public int compareto(bil b) {... ; return... ; // Hvis vi skal ta vare på to ting, der vi ikke krever noe om den første (T), men krever at den andre tingen (U) kan sammenlignes med den første: class Beholder <T, U extends Comparable <T>> {... // For eksempel; Beholder <Bil,Fly> minb = new Beholder <Bil, Fly> ( ) ; 12