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 =
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 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>();
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 ú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) { }
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á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í)
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 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;
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); } }
A, C, D
true
static boolean addAll(Collection c, Object[] elements)
A, D
C
C
Proxy
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.