Co tento kód vypíše?
public class Test { public static void update(StringBuilder sb) { sb.append("!"); sb = new StringBuilder("Hi"); } public static void main(String[] args) { StringBuilder sb = new StringBuilder("Hello"); update(sb); System.out.println(sb); } }
Odpověď: Hello!
Vysvětlení: V Javě se všechny parametry předávají hodnotou. Reference na nový StringBuilder se tedy nepropaguje do sb v main.
Máme definovány následující tři interface:
interface Callable<T> { void get(T t); } interface Function<T, R> { R func(T t); } interface UnnaryOperation<T> extends Function<T, T> { }
Které lambda výrazy se správně zkompilují?
Callable<Integer> ca = b -> -b;Function<Integer, Integer> fu = b -> -b;UnnaryOperation<Integer> uo = b -> -b;Ani jeden, protože
b -> -bnení zkompilovatelný výraz.
Odpověď: 2., 3.
Co kód vypíše?
class A { void foo() { System.out.println("A"); } void bar() { foo(); } } class B extends A { @Override void foo() { System.out.println("B"); } } public class Test { public static void main(String[] args) { A a = new B(); a.bar(); } }
Odpověď: B
Co udělá tento kód?
public record Person(String name) { public static void main(String[] args) { Person p1 = new Person("Peter"); Person p2 = new Person("Peter"); System.out.println(p1 == p2); System.out.println(p1.equals(p2)); } }
Přeloží se a vypíše false true
Přeloží se a vypíše false false
Přeloží se a vypíše true true
Přeloží se a vypíše true false
Nepřeloží se, protože vstupní funkce main nesmí být v record
Nepřeloží se, protože funkce equals není na Person definovaná
Odpověď: 1.
Konstruktory můžeme:
přetěžovat
předefinovávat
ani jedno
Odpověď: 1.
Doplňte co možná nejkratší implementaci třídy Resource, aby šel kód přeložit a spustit bez chyb
class Resource ... public class Test { public static void main(String[] args) { try (Resource r = new Resource()) { } catch (Exception e) {} } }
Možná odpověď:
class Resource implements AutoCloseable { public void close() {} }
Triková, ale kratší odpověď:
class Resource extends StringWriter {}
Vysvětlení: StringWriter také implementuje AutoCloseable a má bezparametrický konstruktor. Například s FileReader bychom museli v Resource definovat explicitní konstruktor volající jeden z konstruktorů FileReader.
Uznal mi ale i první řešení s nějakým balastem navíc, takže o délku doopravdy nejde.
Implementace funkce s generiky
Napište funkci mergeLists, která dostane dva kompatibilní objekty implementující interface List a vrátí nový List, který obsahuje prvky z obou vstupních parametrů. List implementuje interface Iterable a funkce T get(int i) a void add(T a).
Možná odpověď:
public static <T> List<T> mergeLists(List<? extends T> list1, List<? extends T> list2) { List<T> newList = new ArrayList<>(); for (T a : list1) newList.add(a); for (T a : list2) newList.add(a); return newList; }
Uznával také
public static <T> List<T> mergeLists(List<T> list1, List<T> list2) { List<T> newList = new ArrayList<>(); for (T a : list1) newList.add(a); for (T a : list2) newList.add(a); return newList; }
a
public static <T> List<? super T> mergeLists(List<? extends T> list1, List<? extends T> list2) { List<T> newList = new ArrayList<>(); for (T a : list1) newList.add(a); for (T a : list2) newList.add(a); return newList; }
Předefinujte ve třídě B funkci void printFields() tak, aby vypsala obsah a i b:
class A { private int a; public void printFields() { System.out.println(a); } } class B extends A { private int b; ... }
Možná odpověď:
@Override public void printFields() { super.printFields(); System.out.println(b); }
Vysvětlení: Pozor, a je private.
Doplňte do volání metody sort lambda výraz, který setřídí řetězce podle délky
List<String> list = new ArrayList<>(); ... list.sort(...);
Možná odpověď:
(s1, s2) -> s1.length() - s2.length()
Doplňte implementaci funkce validate, aby true vracela pouze pro knihy, jejichž autor není null a je v kolekci allowedAuthors
class Book { String name; String author; } public class Library { private List<String> allowedAuthors = loadAuthors(); public boolean validate(Book book) { ... } }
Možná odpověď:
public boolean validate(Book book) { if (book.author == null) return false; for (String allowedAuthor : allowedAuthors) { if (book.author.equals(allowedAuthor)) return true; } return false; }
Elegantněji třeba:
public boolean validate(Book book) { return book.author != null && allowedAuthors.contains(book.author); }