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