为什么会得到,以及如何解决此“字符串到<objecttype>类型的对象”错误

时间:2019-05-31 13:33:35

标签: java string object arraylist

我(是一个绝对的初学者)正在尝试创建一个简单的工具,该工具创建一些对象并将其链接。 这些对象是: 顾客 许可证(2类,扩展类)

该想法是在创建许可证时使用客户公司名称(其中之一),因此许可证链接到客户。 我使用ArrayLists存储数据。

我尝试将getter用于Customer cCompany,但是当我尝试实际创建新的许可证对象时,出现有关不兼容类型(字符串为类型为customer的对象的字符串)的错误

如何解决该错误?

我们非常感谢您的帮助,但请很好地解释一下,我是一个绝对的初学者。我可能过于复杂了。...

某些代码摘录:

发自Main:

public class Main {

    public static void main(String[] args) {
        //Create customers
        List <Customer> customers = new ArrayList <> (10);
        customers.add(new Customer("TestCompany","John Doe",1234567890,"John@testcompany.com"));


....

//Create Elvis licenses (based on superclass License)
List <ElvisLicense> ellicenses = new ArrayList <> (10);
ellicenses.add(new ElvisLicense("TestCompany","VendorA",1234,"1234-A","Solutions Server gold","1234-dtbk-87654-nlof",10, true , true));

类别:客户:

class Customer {
    String cCompany;
    private String cName;
    private int cPhone;
    private String cEmail;

    public Customer( String cCompany, String cName,int cPhone, String cEmail)
    {
    this.cCompany = cCompany;
    this.cName = cName;
    this.cPhone = cPhone;
    this.cEmail = cEmail;
    }

    //This getter should be used to link the license to the customer (Done in License.java)
    public String getcCompany() {
        return cCompany;
    }

类许可(超类)

class License {
// Used no modifier to set access for Class/Package and Subclass inside the package
Customer licenseCompany;
String lVendor;
int lContractNumber;
String lCertificateNumber;
String lProductName;
String lLicenseKey;
int lNumberOfSeats;


    public License(Customer cCompany, String lVendor, int lContractNumber, String lCertificateNumber, 
            String lProductName, String lLicenseKey, int lNumberOfSeats)
    {
    licenseCompany = cCompany;
    this.lVendor = lVendor;
    this.lVendor = lVendor;
    this.lContractNumber = lContractNumber;
    this.lCertificateNumber = lCertificateNumber;
    this.lProductName = lProductName;
    this.lLicenseKey = lLicenseKey;
    this.lNumberOfSeats = lNumberOfSeats;    
    }


    public Customer getLicenseCompany() {
        return licenseCompany;
    }

    public void setLicenseCompany(Customer licenseCompany) {
        this.licenseCompany = licenseCompany;
    }


//preparations to allow for example printing the content of an arraylist element
    @Override
    public String toString(){
    return "Customer name " + getLicenseCompany()  + "\n" + "Vendor name " + getlVendor()  + "\n" + "Contract number: " + getlContractNumber() + "\n"
               + "Certificate number: " + getlCertificateNumber() + "\n" + 
                "Product name " + getlProductName()  + "\n" + "Licence key: " + getlLicenseKey() + "\n"
               + "Number of seats: " + getlNumberOfSeats();
}


}

扩展类:

public class ElvisLicense extends License{

private boolean elIsBundle;
private boolean elIsSubscription;


public ElvisLicense(
        Customer licenseCompany,
        String lVendor,
        int lContractNumber,
        String lCertificateNumber, 
        String lProductName,
        String lLicenseKey,
        int lNumberOfSeats,
        boolean elIsBundle,
        boolean elIsSubscription
        )

    {
    super(
            licenseCompany,
            lVendor,
            lContractNumber,
            lCertificateNumber,
            lProductName,
            lLicenseKey,
            lNumberOfSeats);

    this.elIsBundle = elIsBundle;
    this.elIsSubscription = elIsSubscription;
    }  


.....



@Override
public String toString(){
    return "Customer name " + licenseCompany  + "\n" 
            + "Vendor name " + lVendor  + "\n" 
            + "Contract number: " + lContractNumber + "\n"
            + "Certificate number: " + lCertificateNumber + "\n" 
            + "Product name " + lProductName  + "\n" 
            + "Licence key: " + lLicenseKey + "\n"
            + "Number of seats: " + lNumberOfSeats + "\n"
            + "Number of seats: " + elIsBundle + "\n" 
            + "Number of seats: " + elIsSubscription;
}

}

我希望在创建新许可证时使用Customername。

2 个答案:

答案 0 :(得分:1)

下一行是错误的。

ellicenses.add(new ElvisLicense("TestCompany","VendorA",1234,"1234-A","Solutions Server gold","1234-dtbk-87654-nlof",10, true , true));

由于许可证需要客户对象作为参数。相反,您应该首先创建客户对象。

ellicenses.add(new ElvisLicense(new Customer("TestCompany","VendorA",1234,"1234-A"),"Solutions Server gold","1234-dtbk-87654-nlof",10, true , true));

重新使用该customer list以避免创建公司。

for(Customer customer : customers){
   // here you need some way to offer other parameters except customer parameter.
   License license = new new ElvisLicense(customer,"Solutions Server gold","1234-dtbk-87654-nlof",10, true , true);
   ellicenses.add(license);
}

答案 1 :(得分:0)

您需要做的是在创建ElvisLicense对象时使用已经创建的Customer对象之一。为了更轻松地按名称查找该客户,建议您将其存储在地图中,而不是将名称作为关键字的列表中。

Map<String, Customer> customerMap = new HashMap<>();
Customer customer = new Customer("TestCompany","John Doe",1234567890,"John@testcompany.com"));
customerMap.put(customer.getcCompany(), customer);

因此,在创建许可证时,您会查找客户

List <ElvisLicense> ellicenses = new ArrayList <> (10);
Customer customer = customerMap.get("TestCompany");
if (customer != null) {
    ElvisLicense license = new ElvisLicense(customer,"VendorA",1234,"1234-A","Solutions Server gold","1234-dtbk-87654-nlof",10, true , true));
    ellicenses.add(license);
} else {
   //If the customer isn't found you need some kind of error handling, better than below :)
   System.out.println("Can't create a license, no customer found");
}