1. Por que não utilizar a notação de composição da UML para mostrar que um cachorro é composto de altura, peso, cor e data de nascimento? 2. Esboce um diagrama de classes para um capítulo de livro com a seguinte estrutura: um capítulo compreende diversas seções, cada uma das quais compreende diversos parágrafos e figuras. Um parágrafo compreende diversas sentenças, cada uma das quais compreende diversas palavras. (Você pode ignorar a pontuação e não precisa ir mais adiante em busca da estrutura de uma figura). Obs.: não esqueça de atribuir as multiplicidades. 3. Um município decide efetuar o recadastramento biométrico de seus eleitores. O sistema deve armazenar para cada eleitor o seu nome, identidade, cpf, endereço residencial e uma foto. Além disso, para cada eleitor é armazenada a impressão digital de cada um de seus dedos, todas obtidas eletronicamente. Cada eleitor é agrupado em seções que por sua vez pertencem a uma zona eleitoral. O sistema deve ser capaz de reconhecer um eleitor por sua impressão digital durante o processo eleitoral. A participação de cada eleitor em um turno de uma eleição, que ocorre em uma data específica, deve ser registrada no sistema que também computa o total de votos por seção e por zona de cada candidato da eleição. Escreva um diagrama de classes que descreve o sistema eleitoral. 4. Um usuário tem acesso a múltiplos arquivos, cada um acessível por um tipo de permissão de acesso. Descreva em UML o relacionamento entre as classes correspondentes. 5. Defina o conceito de "Sistema de Tipos". 6. Defina o conceito de "Polimorfismo". 7. Java é uma linguagem fracamente tipada ou fortemente tipada? justifique. 8. Considere o seguinte trecho de código em Java: class Util { public static void imprime(String dado) { System.out.println("Imprimindo uma String: " + dado); } public static void imprime(Integer dado) { System.out.println("Imprimindo um Integer: " + dado); } } Especificamente em relação à capacidade de criar dois métodos com o mesmo nome e assinaturas diferentes, pode-se dizer que este é um exemplo de polimorfismo ad hoc ou universal? Justifique. 9. Considere o seguinte trecho de código em Java: class Util { public static void imprime(Object dado) { System.out.println(Object); } public static void main(String[] args) { String a = new String(); Integer b = new Integer(); imprime(a); imprime(b); } } Este é um exemplo de polimorfismo ad hoc ou Universal? Justifique. 10. Considere os tipos e métodos genéricos na linguagem Java (Java Generics). Esta capacidade da linguagem pode ser definida como polimorfismo de subtipo ou polimorfismo paramétrico? Justifique. 11. Em relação aos tipos genéricos em Java, qual é a diferença entre um parâmetro de tipo e um argumento de tipo? 12. Considere uma interface Appendable que inclui um método append. Além disso considere duas classes MyString e MyList, as quais implementam Appendable. Deseja-se que o sistema permita que um objeto de MyString seja concatenado com um objeto MyString e um objeto de MyList possa ser concatenado com outro objeto de MyList, mas que não seja admitido a concatenação de objetos de tipos diferentes. Observando a declaração abaixo diga se a interface proposta satisfaz os requisitos especificados quanto a tipagem. Em caso contrário, ofereça uma solução que corrija o problema. interface Appendable{ Appendable append(Appendable a); } 13. Escreva uma classe genérica em Java que implemente uma pilha. A pilha deve permitir as operações push (adiciona um elemento no topo da pilha), pop (remove um elemento do topo da pilha) e isEmpty (que retorna true caso a pilha esteja vazia e false caso contrário). 14. Considere o seguinte trecho de código em Java: public class Algorithm { public static void swap(List<?> a, int i, int j) { Object temp = a.get(i); a.set(i, a.get(j)); a.set(j, temp); } } a. O código não compila. Descreva em qual ou quais linhas erros de compilação ocorrem e explique o motivo. b. Reescreva o método de forma que ele compile. Lembre-se que método deve receber uma lista de um tipo qualquer. 15. Considere o seguinte método genérico em Java: public static void printList(List<Object> l) { for (Object o : l) System.out.println(o); } Considere ainda o seguinte trecho de código que utiliza o método acima: List<String> ls = new ArrayList<String>(); … printList(ls); Este código compila? Em caso negativo, justifique e crie duas versões alternativas do método printList que permitam que a chamada seja bem sucedida. 16. Considere as seguintes três versões de um método genérico que objetiva adicionar todos os elementos de uma lista l2 em uma outra lista l1: public static void addAll(List<?> l1, List<?> l2) { for (Object o : l2) l1.add(o); } public static <T> void addAll(List<T> l1, List<T> l2) { for (T o : l2) l1.add(o); } public static <T> void addAll(List<T> l1, List<? extends T> l2) { for (T o : l2) l1.add(o); } Discuta quais (se alguma) versões deste método compilam. Se mais de uma versão, de fato, compila, discuta as diferenças entre elas (i.e., se são equivalentes, ou se há alguma vantagem em relação a alguma delas). 17. Considere as seguintes duas versões de uma classe que tem por objetivo implementar um "vetor de elementos de tipo genérico": class Vetor { Object[] elementos = new Object[100]; public void set(Object elem, int pos) { elementos[pos] = elem; } public Object get(int pos) { return(elementos[pos]); } } class Vetor<T> { Object[] elementos = new Object[100]; public void set(T elem, int pos) { elementos[pos] = elem; } public T get(int pos) { return(elementos[pos]); } } Aponte vantagens da segunda versão sobre a primeira. Além disso, discuta se existe alguma situação na qual a primeira versão seria desejável (sugestão: pense se há algum uso legítimo que seja possível com a primeira versão e não com a segunda). 18. Na questão anterior, na segunda versão proposta, foi usado o tipo Object para a declaração do atributo elementos. Poderíamos usar o parâmetro de tipo T? 19. Em Java, se utilizamos um parâmetro de tipo em um método genérico estático é obrigatória a declaração do mesmo antes do tipo de retorno. Explique o motivo para isso. 20. O que é uma classe abstrata? 21. O que é uma interface? 22. O que é um método estático? 23. O que é um atributo estático? 24. Discuta as diferenças entre uma classe abstrata e uma interface. 25. Considere as implementações de coleções vistas em sala. Faça a implementação de uma pilha genérica na forma de extensão (i.e., herança) de uma destas implementações. 26. Uma empresa de brinquedos armazena registros de todos os seus empregados contendo nome, CPF, data de ingresso e cargo. Como política da empresa, é comum a doação de certos benefícios aos empregados e uso dos nomes de alguns dos empregados nos seus produtos. Considere as quatro interfaces principais da API Collections do Java, Set, List, Queue, and Map. Especifique quais das quatro interfaces é mais apropriada para armazenar os dados necessários para a execução de cada uma das atividades que deve ser realizada pelo sistema da empresa e explique a razão de sua escolha. As atividades são: a. Mensalmente um empregado deve ser escolhido aleatoriamente para receber um brinquedo grátis. b. Cada novo produto lançado pela fábrica deve ser nomeado a partir do primeiro nome de um empregado. Na escolha, não devem ser consideradas duplicatas de nomes. c. Os brinquedos especiais devem ser batizados com os nomes mais populares da empresa. d. A empresa adquiriu ingressos para partidas de futebol que serão distribuídos aos empregados. A empresa mantem uma ordem de espera para distribuição dos ingressos aos empregados, ordem que depende do momento da solicitação do ingresso por cada empregado. 27. Escreva um método genérico que ordene listas genéricas, que implementam a interface List do Java, de acordo com um critério de ordenação arbitrário. Obs.: Não utilize o método sort da classe utilitária Collections. Utilize apenas as operações da interface.