Zadanie dnešnej skúšky z Javy:
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 = ...
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){ ... }
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>();
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());
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) { }
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", )
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.
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í)
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()):
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); } }
A, C, D
true (preto že erasure)
static boolean addAll(Collection c, Object[] elements){}
A, D (B neprejde lebo poradie je neurčité a C neprejde lebo synopsis nema default)
C ( aby platilo A cez reflexion musí byt opens nie requires)
C
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));