Warnings java

7 respostas
F

Account is a raw type. References to generic type Account should be parameterized

Type safety: Unchecked invocation sort(List) of the generic method sort(List) of type Collections

pessoa eu tenho esses dos warnigns, voces sabem indicar-me a que se devem?
obrigado!!

7 Respostas

Ravnus

Tente postar o código com o problema.

F

obrigado pela sua resposta, eu coloquei comentarios com os warninggs nos respectivos locais

package sistema;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class Bank {

	static List <Account> lista = new ArrayList<Account>(); //warning - Account is a raw type. References to generic type Account<T> should be  parameterized

	public void stop() {
		// TODO Auto-generated method stub
		System.exit(1);
	}

	 public void deposit1() {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);    
		System.out.println("Your name account:");    
		String find = sc.nextLine();

		Account<?> ac = findByName(find);

		if(ac == null) {
			System.out.println("Account does not exist");
		} else {
			System.out.println("Found account! " + ac);
			Scanner sc1 = new Scanner(System.in);    
			System.out.println("What value do you want to deposit: "); 
			Double scan = sc1.nextDouble();
			ac.deposit(scan);
		}
	}

	public void withdraw1() {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);    
		System.out.println("Your name account: ");    
		String find = sc.nextLine();

		Account<?> ac = findByName(find);

		if(ac == null) {
			System.out.println("Account does not exist");
		} else {
			System.out.println("Found account! " + ac);
			Scanner sc1 = new Scanner(System.in);    
			System.out.println("What value do you want to withdraw: "); 
			Double scan = sc1.nextDouble();
			ac.withdraw(scan);

		}
	}

	private Account<?> findByName(String name) {
		// TODO Auto-generated method stub
		for(Account<?> ac :lista) {
			if(ac.getAccountName().equals(name)) {
				return ac;
			}
		}
		return null;
	}


	public void showAll()  {
		// TODO Auto-generated method stub

		CurrentAccount account1 = new CurrentAccount("Alberto Carlos", 1052);
		CurrentAccount account2 = new CurrentAccount("Pedro Fonseca", 30);
		CurrentAccount account3 = new CurrentAccount("Ricardo Vitor", 1534);
		CurrentAccount account4 = new CurrentAccount("João Lopes", 3135);

		AccountLongTerm account11 = new AccountLongTerm("Jacinto Alves", 54502);
		AccountLongTerm account12 = new AccountLongTerm("Ana Anabela", 30);
		AccountLongTerm account13 = new AccountLongTerm("Carlos Brás", 1234);
		AccountLongTerm account14 = new AccountLongTerm("José Fonseca", 545);

		AccountP account21 = new AccountP("Manuel Jose", 2200);
		AccountP account22 = new AccountP("Carla Costa", 3050);
		AccountP account23 = new AccountP("Francisco José", 12214);
		AccountP account24 = new AccountP("Alberto Teixeira", 31415);

		Bank Bank1 = new Bank (); 

		Bank1.addAccount(account1);
		Bank1.addAccount(account2);
		Bank1.addAccount(account3);
		Bank1.addAccount(account4);		
		Bank1.addAccount(account11);
		Bank1.addAccount(account12);
		Bank1.addAccount(account13);
		Bank1.addAccount(account14);
		Bank1.addAccount(account21);
		Bank1.addAccount(account22);
		Bank1.addAccount(account23);
		Bank1.addAccount(account24);

		Collections.sort(Bank1.lista); // Type safety: Unchecked invocation sort(List<Account>) of the generic method sort(List<T>) of type Collections

		System.out.printf("Bank Accounts:" + "%n");
		Iterator<Account> itr = Bank1.lista.iterator(); //Account is a raw type. References to generic type Account<T> should be parameterized
		while (itr.hasNext()) {
			Account<?>  element = itr.next();
			System.out.printf(element + " " + "%n");
		}
		System.out.println();
	}

	public void addAccount(Account<?> account) {
		lista.add (account);
	};
}

e este

package sistema;

import java.text.DecimalFormat;

abstract class Account<T> implements java.lang.Comparable<T> {

	private String accountName;
	private double balance;
	protected double resultLong;
	protected double rate;

	public Account (String accountN, double bal) {
		// TODO Auto-generated constructor stub
		setAccountName(accountN);
		setBalance(bal);
	}

	public int compareTo(Object o) {
		// TODO Auto-generated method stub

		if (this.getBalance() > ((Account<?>) o).getBalance()) {
			return -1;
		}
		if (this.getBalance() < ((Account<?>) o).getBalance()) {
			return 1;
		}
		return 0;
	}

	DecimalFormat balanceMoney = new DecimalFormat( " 0" ); 
	DecimalFormat decimals = new DecimalFormat( " 0.00 " );  

	public double resultLong() {
		return resultLong = balance*rate;
	}

	public void setBalance(double balance) {
		this.balance = balance;
	}


	public double getBalance() {
		return balance;
	}


	public void setAccountName(String accountName) {
		this.accountName = accountName;
	}


	public String getAccountName() {
		return accountName;
	}

	public abstract void deposit(double amount);
	public abstract double withdraw (double amount);

}
adriano_si

Se você perceber, a classe Account possui um Genérico…

quando você cria seu ArrayList na classe Bank você está passando um Account sem a classe que deveria ser o Genérico

Faça assim static List <Account<SuaClasseGenerica>> lista = new ArrayList<Account<SuaClasseGenerica>>();

Agora cuidado, acho que você ainda não entendeu os Generics, essa classe tem que fazer algum sentido no negócio…

em tempo de execução seus <> são apagados pelo compilador, eles não existem, eles existem somente para que o compilador faça a checagem de tipos que você está usando em tempo de compilação mesmo…

Abs []

F

obrigado pelo esclarecimento

eu ja tinha tentado essa solução por acaso

eu tentei com

static List <Account<T>> lista = new ArrayList<Account<T>>();

mas aí o compilador dá um erro

T cannot be resolved to a type

ViniGodoy

Troque essa declaração:

abstract class Account<T> implements java.lang.Comparable<T> {

Para:

abstract class Account implements Comparable<Account> {

E vai ter que arrumar seu método compareTo para:

@Override public int compareTo(Account o) { if (this.getBalance() > o.getBalance()) { return -1; } if (this.getBalance() < o.getBalance()) { return 1; } return 0; }

Ou, simplesmente para:

@Override public int compareTo(Account o) { return o.getBalance() - this.getBalance(); }

F

ola

tudo resolvido!

voce pode explicar qual era a razão de o java.lang.Comparable estar a causar o erro?

queria perceber

Mt obrigado :slight_smile:

ViniGodoy

Comparable<T> significa que é uma classe que é capaz de comparar-se com outra, do tipo “T”.

Uma Account pode comparar-se com outra Account, então você precisa dizer ao Java que o tipo “T” é Account.

Para mais informações leia:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Criado 14 de dezembro de 2010
Ultima resposta 14 de dez. de 2010
Respostas 7
Participantes 4