[NPRG021] - Pokročilé programování v jazyce Java 2024

Dalek at 2024-05-27 17:33:28

Zadanie dnešnej skúšky z Javy:

  1. Do proměnné cl přiřadte instanci třídy Class, která reprezentuje typ „pole typu Double". Definujete i typ proměnné cl. Upozornění - nezapomeňte, že Class je generický typ.

    ... cl = ...

  2. Napište metodu fill, která nahradí všechny prvky v daném seznamu daným objektem. Metoda je použitelná na libovolný seznam a objekt odpovídajícího typu. Nápověda - počet prvků v seznamu lze zjistit metodou size(), odstranit všechny prvky metodou removeAll() a přidat prvek metodou add(T t).

    ... fill(List<... col, ... obj){ ... }

  3. Předpokládejme následující definice:

    class GenericClass<T> {} GenericClass<String> gs = new GenericClass<>(); GenericClass<?> gq = new Generic Class<>();

Která z následujících přiřazení jsou legální?
A. gq = gs;
B. gs = gq;
C. gs = new Generic Class<String>();
D. gq = new GenericClass<Object>();

  1. Co vypíše následující kód?

    List<String> l1 = new ArrayList<String>(); List<Integer> l2: = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getClass());

  2. Jakou signaturu bude mít následující metoda na úrovní bajtkódu? (nápověda - co udělá při překladu erasure mechanizmus s generickými parametry?)

    static <T> boolean addAll(Collection<? super T> c, T... elements) { }

  3. Předpokládejme definici následující anotace:

    public @interface RequestForEnhancement { String synopsis(); String date() default "[unimplemented]"; }

Která z následujících použití jsou legální (překladač je přeloží)?
A.

@RequestForEnhancement(
synopsis = "Enable time-travel",
date = "4/1/3007"
)

B.

@RequestForEnhancement(
"Enable time-travel",
"4/1/3007"
)

C.

@RequestForEnhancement

D.

@RequestForEnhancement(
synopsis = "Enable time-travel",
)
  1. Předpokládejte modul s následujícím deskriptorem (souborem module-info.java):

    module com.foo {exports com.foo.bar;requires java.logging; }

Co platí pro kód v tomto modulu ve vztahu k modulu java logging?
A. Kód může přistupovat úplně ke všemu v modulu java.logging.
B. Kód může přistupovat pouze k public elementum v modulu java.logging, které jsou v jakémkoliv balíčku.
C. Kód může přistupovat pouze k public elementum v modulu java.logging, které jsou v java.logging v exportovaných balíčcích.
D. Pouze kód z balíčku com.foo.bar může přistupovat k public elementům v modulu java.logging, které jsou v java.logging v exportovaných balíčcích.

  1. Co platí o následujícím kódu:

    1 public class Foo { 2 public <T> T castParam(Object o) { 3 return (T) o; 4 } 5}

A. Nelze přeložit, chyba je na řádku 2 - deklaraci generických proměnných lze napsat jen do hlavičky třídy
B. Nelze přeložit, chyba je na řádky 3- nelze přetypovat pomocí generické proměnné
C. Lze přeložit, ale kompilátor vypíše na řádku 3 varování
D. Lze přeložit (bez chyb a bez varování)

  1. Mějme následující anotaci:

    @interface Foo

Anotace je použita na třídě XYZ

@Foo
class XYZ {}

V dalším kódu pak v proměnné clazz máme instanci třídy Class reprezentující třídu XYZ a použijeme ji následovně:

Foo fooAnnot = clazz.getAnnotation(Foo.class);

Jaký typ vypíše následující kód (není nutné napsat plné jméno typu)?

System.out.println(fooAnnot.getClass()): 
  1. Mějme třídu MyDynArray, která implementuje dynamické pole pomocí obyčejného pole, tj. funguje obdobně jako standardní třída java.util.ArrayList. Přidejte do této třídy metodu forEach, která jako parametr bere lambda výraz s aplikuje jej na každý prvek v poli. Lambda výraz má jeden parametr a žádný návratový typ. Napište i příklad použití.

    class MyDynArray{private Object[] data;private int count; // pocet obsazenych prvku v poli data//....forEach( } MyDynArray arr = new MyDynArray(); arr. forEach(

Riešenie:
1.

 Class<Double[]> cl = Double[].class;
static <T> void fill(List<? super T> col, T obj) {
        int size = col.size();
        col.removeAll();
        for (int i = 0; i < size; i++) {
            col.add(obj);
        }
}
  1. A, C, D

  2. true (preto že erasure)

static boolean addAll(Collection c, Object[] elements){}
  1. A, D (B neprejde lebo poradie je neurčité a C neprejde lebo synopsis nema default)

  2. C ( aby platilo A cez reflexion musí byt opens nie requires)

  3. C

  4. Proxy

class MyDynArray {
private Object[] data;private int count; // pocet obsazenych prvku v poli datapublic void forEach(Consumer<Object> lambda) {for (int i = 0; i < count; i++) {lambda.accept(data[i]);}}
}

MyDynArray array = new MyDynArray();
array.forEach(a -> System.out.println(a));