[NPRG021] Hnětynka adv. Java 2022?

warlord at 2024-05-19 00:43:50

nějaké staré zadání z roku 2022, za správnost odpovědí neručím

  1. Přiřaďte do proměnné cl instanci typu Class reprezentující Integer

    ..... cl = .....;

Řešení:

Class<Integer> cl = Integer.class;
  1. Mějme následující

    Set<String> ss = new HashSet<>(); Set<Object> so = new HashSet<>(); Collection<Object> co = new HashSet<>(); Collection<?> cu = new HashSet<>();

Která přiřazení jsou validní?
A) so = ss;
B) co = so;
C) co = ss;
D) cu = so;
Řešení: B, D

  1. Napište generickou metodu fill(), která nahradí všechny prvky v jakékoli kolekci daným objektem správného typu.
    Kolekce má metody size(), removeAll(), add().

    ..... fill(Collection ..... col , ..... obj) {..... }

Řešení:

public <T> void fill(Collection<? super T> col, T obj) {int size = col.size();col.removeAll();for (int i = 0; i < size; i++) {col.add(obj);}
  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());

Řešení: true

  1. Na co se zredukuje následující metoda v rámci erasure mechanismu?

    public <T> boolean addAll(Collection<? super T> col, T... elements);

Řešení:

public boolean addAll(Collection col, Object[] elements);
  1. Mějme následující

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

Která použití jsou validní?
A) @RequestForEnhancement
B) @RequestForEnhancement(synopsis = "abcd")
C) @RequestForEnhancement("abcd", "23/05/2022")
D) @RequestForEnhancement(synopsis = "abcd", date = "23/05/2022")
Řešení: B, D
(synopsis nemá default hodnotu, musí být specifikováno, anotace nemají poziční argumenty)

  1. Mějme soubor Foo.java. Které z jeho obsahů by byly validní?

    • A) public @interface Foo {}

    • B) public @annotation Foo {String date(); }

    • C) import java.util.Date; public @interface Foo {Date date(); }

    • D) public @interface Foo {String date(); }

Řešení: A, D, nevím, jestli ne i C

  1. Co platí pro následující kód?

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

  • A) Nejde přeložit, chyba na řádku 2, generické typy mohou být pouze v hlavičce třídy

  • B) Nejde přeložit, chyba na řádku 3, nemůžeme přetypovávat generickým typem

  • C) Přeloží se, kompilátor vyhodí warning na řádku 3

  • D) Přeloží se bez chyb a bez warningů

Řešení: C

  1. Přiřaďte do proměnné foo instanci třídy, jejíž Class je v proměnné cl a o níž nic dalšího nevíte.

    ..... cl = getSomeClass(); ..... foo = .....

Řešení:

Class<?> cl = getSomeClass();
Object foo = cl.getInstance();

Lepší by bylo použít konstruktor, ale tohle taky jde.

  1. Mějme dynamické pole implementované podobně jako klasický ArrayList.
    Doplňte metodu forEach, která dostane lambda výraz a aplikuje ho na uložené prvky.
    Lambda výraz přijímá jeden parametr a nic nevrací. Doplňte také ukázkové použití metody.

    class MyDynArray { Object[] data;int count; // počet prvků v poli data ..... forEach( ..... ) }

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

Řešení:

class MyDynArray {
Object[] data;int count; // počet prvků v poli data
public void forEach(Consumer<Object> lambda) {for (int i = 0; i < count; i++) {lambda(data[i]);}}
}

MyDynArray array = new MyDynArray();
array.forEach(a -> System.out.println(a));
sezikpepa at 2024-05-26 12:23:47

Otázka 7 nemůže být C, protože v anotacích nemůže být date