• Keine Ergebnisse gefunden

Advanced Aspects of Object-Oriented Programming (SS 2015) Practice Sheet 4 (Hints and Comments)

N/A
N/A
Protected

Academic year: 2022

Aktie "Advanced Aspects of Object-Oriented Programming (SS 2015) Practice Sheet 4 (Hints and Comments)"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Prof. Dr. A. Poetzsch-Heffter Mathias Weber, M.Sc.

University of Kaiserslautern Department of Computer Science Software Technology Group

Advanced Aspects of Object-Oriented Programming (SS 2015) Practice Sheet 4 (Hints and Comments)

Exercise 1 Featherweight Java

a) Person-class:

• f ields(Object)=•

• f ields(Person)=String name, int age

• mtype(m, Person)=• →int

• using T-Class: K=Person(String name, int age){super(); this.name = name; this.age = age;}X

• Method getAge() using T-Method: this: Person`this.age : int and int<: int (because of rule T-Field)X

Student-class:

• f ields(Person)=String name, int age

• f ileds(Student)=int studentId

• using T-Class: K=Student(String name, int age, int studentId){super(); ...}X

• Method me() using T-Method: this: Student`(Person)this : Person (because of rule T-UCast)X

goal : class Main extends Object {...} OK

--- apply (T - Class )

subgoal : K = Main (){super();} X subgoal : fields ( Object ) = [] X

subgoal : Person main (){return new Person (" Berta " , new Student (" Bob " , 22 , 12345). getAge ());}

OK in Person

--- apply (T - Method )

subgoal : Person <: Person X

subgoal : class Main extends Object {...} X

subgoal : if mtype( main , Object ) = [] D then [] = [] and Person = D X ( because method main is not in Object )

subgoal : this : Main ` new Person (" Berta " , new Student (" Bob " , 22 , 12345). getAge ()) : Person ---

apply (T - New )

subgoal : f ields( Person ) = [ String name , int age ] X subgoal : String <: String X

subgoal : int <: int X

subgoal : this : Main ` " Berta " : String X

subgoal : this: Main ` new Student (" Bob " , 22 , 12345). getAge () : int ---

apply (T - Invk )

subgoal : mtype( getAge , Student ) = [] -> int X ( subgoal : this: Main ` • X) ( no parameters )

subgoal : this: Main ` new Student (" Bob " , 22 , 12345) : Student ---

apply (T - New )

subgoal : f ields( Student ) = [ String name , int age , int studentId ] X subgoal : this: Main ` " Bob " : String X

subgaol : this: Main ` 22 : int X subgoal : this: Main ` 12345 : int X subgoal : String <: String X

subgoal : int <: int X subgoal : int <: int X no subgoals left X

(2)

b)

mbody(getAge,Student)=mbody(getAge,Person) mbody(getAge,Person)=[].this.age mbody(getAge,Student)=[].this.age

RC-New-Arg

R-Invk

mbody(getAge,Student)=[].this.age

new Student("Bob", 22, 12345).getAge()→new Student("Bob", 22, 12345).age

new Person("Berta", new Student("Bob", 22, 12345).getAge())→new Person("Berta", new Student("Bob", 22, 12345).age)

RC-New-Arg

R-Field

f ields(Student)=[String name, int age, int studentId]

new Student("Bob", 22, 12345).age→22

new Person("Berta", new Student("Bob", 22, 12345).age)→new Person("Berta", 22) c) Rule T-Let:

Γ`e1:D Γ,x:D`e2:C Γ`letx=e1ine2:C Rule R-Let:

letx=e1ine2−→[e1/x]e2

Exercise 2 Generics

a) static <A > void flip ( Pair <A ,A > p) { A tmp = p. snd ;

p. snd = p. fst ; p. fst = tmp ; }

b) Collection<?> can hold a collection of anything, whereasCollection<Object> only holds collections to objects, i.e. Collection<?> c = new ArrayList<String>();is valid, whereasCollection<Object> c

= new ArrayList<String>();is not (remember that generic types are invariant).

c) The output isoverloadedMethod (Collection <?>), because overloading is resolved at compile time and at compile time the parameter t has type List<T>, such that the most specific method that can be applied is the one for the generic collection. (see JLS 15.12)

d) The method without the parameteracan be written and compiled. But whenever you try to execute it, you will get a class cast exception, except for T=Object.

<T > T [] toArray () {

T [] res = (T [])(new Object [l. size ()]);

for (int i = 0; i < res . length ; i ++) { res [i] = l. get (i );

}

return res ; }

The parameter serves as a kind of type token. Either the given array can be directly used or if the provided array is not large enough it can be used to create a bigger array, using e.g.

public static Object Array.newInstance(Class<?> componentType, int length) throws NegativeArraySizeException

2

Referenzen

ÄHNLICHE DOKUMENTE

[r]

[r]

For the first time, Clara provides a uniform way to (1) specify runtime monitors as annotated AspectJ aspects, and (2) integrate novel static typestate analyses.. During the process,

Refine the behavior of the getChar() method such that it returns the next character of the string if the position is not at the end and that it returns -1 if the reader is at the end

b) If the set of types / roles can be given at compile time and it will not change for an object during its lifecycle, it is usually a good idea to use subtyping and, if

b) Implement a StringReader. First add an interface equivalent to the BlankReader including the specification of the behavior. Second add an implementation of StringReader that

b) If the set of types / roles can be given at compile time and it will not change for an object during its lifecycle, it is usually a good idea to use subtyping and, if

a) Write a generic static method flip which takes an object of class Pair (see the slides of the lecture) and flips the elements of the given Pair object. Hint: In order to flip