首页 > 解决方案 > 类型不适用,我找不到错误

问题描述

读完,这里开头是代码:

班级:

package Relatorio;

public class Cliente {
    private String nome;
    private String sexo;
    private int idade;
    private double salario;

    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getSexo() {
        return sexo;
    }
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }
    public int getIdade() {
        return idade;
    }
    public void setIdade(int idade) {
        this.idade = idade;
    }
    public double getSalario() {
        return salario;
    }
    public void setSalario(double salario) {
        this.salario = salario;
    }
}

班级:

package Relatorio;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;

public class Leitor {

    Charset utf8 = StandardCharsets.UTF_8;
    Path path = null;
    String line = null;

    public ArrayList<String> ler(String url) {
        path = Paths.get(url);
        ArrayList<String> lines = null;
        try (BufferedReader reader = Files.newBufferedReader(path, utf8)) {
            lines = new ArrayList<>();
            while((line = reader.readLine()) != null) {
                lines.add(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return lines;
    }

    public ArrayList<Object> lerRelatorio(String url, Relatorio relatorio) {
        path = Paths.get(url);
        ArrayList<Object> lines = null;
        try (BufferedReader reader = Files.newBufferedReader(path, utf8)) {
            lines = new ArrayList<>();
            while((line = reader.readLine()) != null) {
                lines.add(relatorio.tipoDoRelatorio(line));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return lines;
    }
}

班级:

package Relatorio;

import java.util.ArrayList;

import Praticando.Cliente;

public abstract class Relatorio {

    public abstract Cliente tipoDoRelatorio(String line);

    public abstract void apresentarRelatorio(ArrayList<Cliente> listaClientes);

}

班级:

package Relatorio;

import java.util.ArrayList;

import Praticando.Cliente;

public class RelatorioBasico extends Relatorio {

    Cliente cliente = null;
    int aux = 0;

    @Override
    public Cliente tipoDoRelatorio(String line) {
        if(aux == 0) {
            cliente = new Cliente();
            cliente.setNome(line);
        }
        if(aux == 1) {
            cliente.setSexo(line);
        }
        if(aux == 2) {
            cliente.setIdade(Integer.parseInt(line));
        }
        if(aux == 3) {
            cliente.setSalario(Double.parseDouble(line));
            aux = -1;
        }
        aux++;
        return cliente;
    }

    @Override
    public void apresentarRelatorio(ArrayList<Cliente> listaClientes) {
        for(Cliente cli : listaClientes) {
            System.out.println("Nome: " + cli.getNome() + ", tem " + cli.getIdade() + " anos e é do sexo " + cli.getSexo() + ".");
        }
    }

}

班级:

package Relatorio;

public class AppTeste {

    public static void main(String[] args) {

        Leitor leitor = new Leitor();
        RelatorioBasico relatorio = new RelatorioBasico();

        relatorio.apresentarRelatorio(leitor.lerRelatorio("C:/arquivo.txt", relatorio));
    }

}

错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method apresentarRelatorio(ArrayList<Cliente>) in the type RelatorioBasico is not applicable for the arguments (ArrayList<Object>)

    at Relatorio.AppTeste.main(AppTeste.java:10)

似乎没问题,即使我在 AppTeste 类中进行测试时,我声明:

relatorio.apresentarRelatorio(leitor.lerRelatorio("C:/arquivo.txt", relatorio));

已经出现了一个警告说:

The method apresentarRelatorio(ArrayList<Cliente>) in the type RelatorioBasico is not applicable for the arguments (ArrayList<Object>)

我认为这可能是因为 Reader 类中的方法:

public ArrayList<Object> lerRelatorio(String url, Relatorio relatorio) {
        path = Paths.get(url);
        ArrayList<Object> lines = null;
        try (BufferedReader reader = Files.newBufferedReader(path, utf8)) {
            lines = new ArrayList<>();
            while((line = reader.readLine()) != null) {
                lines.add(relatorio.tipoDoRelatorio(line));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return lines;
    }

零件:

public ArrayList<Object> lerRelatorio(String url, Relatorio relatorio) {

ArrayList<Object> lines = null;

因为 ArrayList,但即使是特定的 ArrayList,它也会一直出错,我已经阅读并重读了很多次,但我不知道它可能是什么以及我错在哪里......

拜托,如果有人意识到这个错误,你能告诉我吗?

如果有人需要源代码,请链接: https ://github.com/frnndio/Praticando/tree/master/PraticandoJava/src/Relatorio

标签: java

解决方案


此错误表明该方法apresentarRelatorio(ArrayList<Cliente>)需要一个,ArrayList<Cliente>但您正在使用一个ArrayList<Object>.

您已正确识别出需要更改的行:

public ArrayList<Object> lerRelatorio(String url, Relatorio relatorio) {

应该

public ArrayList<Cliente> lerRelatorio(String url, Relatorio relatorio) {

ArrayList<Object> lines = null;

应该

ArrayList<Cliente> lines = null;

编辑:此外,您的代码中有两个类的副本Cliente,一个PraticicandoRelatorio. RelatorioBasico.apresentarRelatorio()期望Praticando.Cliente实例但Leitor.lerRelatorio()创建Relatorio.Cliente实例。

Relatorio.java两者的第 5 行都RelatorioBasic.java导入了 Practicando.Cliente,这是导致该错误的原因:

import Practicando.Cliente;

删除这 2 个 import 语句,您的代码将编译。


推荐阅读