Pokročilá Java [zkouška 27.5.2024]

MájaH at 2024-05-30 15:52:19
  1. Do proměnné cl přiřaďte instanci třídy Class, která reprezentuje typ „pole typu Double". Definujte 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 GenericClass<>();

Která z následujících přiřazení jsou legální?
A. gq = gs;
B. gs = gq;
C. gs = new GenericClass<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 úrovni bajtkódu? (nápověda — co udělá při překladu erasure mechanismus 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ádejme modul s následujícím deskriptorem (souborem module-info.java):

    module com.foo { export 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 elementům v modulu java.logging, které jsou v jakémkoliv balíčku.
C. Kód může přistupovat pouze k public elementům 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.

8.Co platí o následujícím kódu?

public class Foo {
   public <T> T castParam(Object o) {
      return (T) o;
   }
}

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 řádku 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 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 a aplikuje jej na každý prvek v poli. Lambda výrz má jeden parametr a žádný návratový typ. Napište i příklad použití této forEach metody.

    class MyDynAray { private Object[] data; private int count; // pocet obsazenych prvku v poli data

    //.... forEach(

    }

    MyDynArray arr = new MyDynArray(); arr.forEach(

ŘEŠENÍ:
1.

Class<Double[]> cl = Double[].class;
  1. Například takto (fungovalo by to i bez super, tedy s <T> col):

    public <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); } }

  2. A, C, D

  3. true

static boolean addAll(Collection c, Object[] elements)
  1. A, D

  2. C

  3. C

  4. Proxy

  5. Například:

    class MyDynAray { private Object[] data; private int count; // pocet obsazenych prvku v poli data

    //.... public void forEach(Consumer<Object> lambda) { for (int i = 0; i < count; i++) { lambda(data[i]); } } }

    MyDynArray arr = new MyDynArray(); arr.forEach(x -> System.out.println(x));

Šlo tam použít takhle Consumer<Object> interface, nebo si člověk mohl definovat vlastní funkcionální interface a použít ten.