function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
soumya 1soumya 1 

FATAL_ERROR System.TypeException: Invalid conversion from runtime type Contact to REO_Application__c

In TriggerHandler i am getting 'FATAL_ERROR System.TypeException: Invalid conversion from runtime type Contact to REO_Application__c'
line number 15
REO_Application__c reo = (REO_Application__c)application;


Trigger:

trigger REOApplicationTrigger on REO_Application__c (before insert, before update, after update) {
    new REOApplicationTriggerHandler().run();
}

TriggerHandler :

public without sharing class REOApplicationTriggerHandler extends TriggerHandler {
    public REOApplicationTriggerHandler() {}
   
    override public void beforeInsert() {
        List<REO_Application__c> REOsToCreateContact = new List<REO_Application__c>();
        for(REO_Application__c reo : (List<REO_Application__c>)Trigger.new) {
            if(reo.Applicant_Contact__c == null) {
                REOsToCreateContact.add(reo);
            }                                                        
        }  
        if(!REOsToCreateContact.isEmpty()) {
            Map<SObject, Id> applicationContactIds = Utility.createContact(REOsToCreateContact, Utility.getContactFieldMapping('REO'));
            if(applicationContactIds != null) {
                for(SObject application : applicationContactIds.keySet()) {
                    REO_Application__c reo = (REO_Application__c)application;
                    reo.Applicant_Contact__c = applicationContactIds.get(reo);
                }                
            }          
        }
    }

Utility: getContactFieldMapping

  public static Map<String, String> getContactFieldMapping(String objType) {
        Map<String, String> fieldMap = new Map<String, String>();
        switch on objType {
            when 'REO' {
                fieldMap.put('Applicant_Last_Name__c', 'LastName');
                fieldMap.put('Applicant_Country__c', 'MailingCountry');
                fieldMap.put('Applicant_Postal_Code__c', 'MailingPostalCode');
                fieldMap.put('Applicant_Street__c', 'MailingStreet');
                fieldMap.put('Applicant_Mobile__c', 'MobilePhone');
                fieldMap.put('Applicant_NRIC_FIN__c', 'NRIC_FIN__c');
                fieldMap.put('Applicant_Phone__c', 'Phone');
                fieldMap.put('Date_of_Birth__c', 'Birthdate');                
                fieldMap.put('Gender__c', 'Gender__c');
                fieldmap.put('Applicant_Nationality__c', 'Nationality__c');
                fieldMap.put('Work_Permit_Expiry_Date__c', 'Work_Permit_Expiry_Date__c');
                fieldMap.put('Work_Permit_Number__c', 'Work_Permit_Number__c');
            }
            when 'RES' {
                fieldMap.put('Applicant_Last_Name__c', 'LastName');
                fieldMap.put('Applicant_Country__c', 'MailingCountry');
                fieldMap.put('Applicant_Postal_Code__c', 'MailingPostalCode');
                fieldMap.put('Applicant_Street__c', 'MailingStreet');
                fieldMap.put('Applicant_Mobile__c', 'MobilePhone');
                fieldMap.put('Applicant_NRIC_FIN__c', 'NRIC_FIN__c');
                fieldMap.put('Applicant_Phone__c', 'Phone');
                fieldMap.put('Date_of_Birth__c', 'Birthdate');                
                fieldMap.put('Gender__c', 'Gender__c');        
                fieldmap.put('Applicant_Nationality__c', 'Nationality__c');
                fieldMap.put('Work_Permit_Expiry_Date__c', 'Work_Permit_Expiry_Date__c');
                fieldMap.put('Work_Permit_Number__c', 'Work_Permit_Number__c');                
            }
            when else {
                return null;
            }
        }
        return fieldMap;
    }
Darshit Pathak 10Darshit Pathak 10
Utility.createContact method would be returning Contact and here you are trying to type cast it with other Sobject i.e. REO_Application__c, So it will throw the error.
Please mark this as best answer if it helps!

Regards,
Darshit Pathak
Shubham Jain 338Shubham Jain 338
Hi Soumya,

Can you give the code of the Utility.createContact method?


Thanks 
Shubham Jain
soumya 1soumya 1
    public static Map<SObject, Id> createContact(List<SObject> objToCopy, Map<String, String> fieldMap) {
        Map<SObject, SObject> applicationContact = new Map<SObject, SObject>();
        Map<SObject, Id> applicationContactId = new Map<SObject, Id>();
        Set<Id> personAccCreatedIds = new Set<Id>();
        Id userConId = [Select ContactId From User Where Id = :UserInfo.getUserId()].ContactId;
        if(userConId != null) {
            Contact userCon  = [Select AccountId, IsPersonAccount From Contact Where Id = :userConId];
            RecordType personAccRecType = [Select Id From RecordType Where Name = 'Person Account' And SObjectType = 'Account'];
            Set<String> accountFields = Schema.SObjectType.Account.fields.getMap().keySet();
            
            for(SObject obj : objToCopy) {
                if(!userCon.IsPersonAccount) {
                    Contact con = new Contact();
                    for(String objField : fieldMap.keySet()) {
                        con.put(fieldMap.get(objField), obj.get(objField));
                    }
                    con.AccountId = userCon.AccountId;  
                    applicationContact.put(obj, con);
                } else {
                    Account personAcc = new Account();
                    personAcc.RecordTypeId = personAccRecType.Id;
                    for(String objField : fieldMap.keySet()) {
                        personAcc.put(getPersonAccountAlias(fieldMap.get(objField), accountFields), obj.get(objField));
                    }
                    applicationContact.put(obj, personAcc);
                }
            }
            
            try {
                insert applicationContact.values();
                for(SObject conOrPersonAcc : applicationContact.values()) {
                    if(conOrPersonAcc.getSObjectType() == Account.SObjectType) {
                        personAccCreatedIds.add(conOrPersonAcc.Id);
                    }
                }
Shubham Jain 338Shubham Jain 338
Hi Soumya,

I believe this method is returning applicationContactId Map, if not then where is the return of the method? 
Where you are assigning values in the map which you are returning?


Thanks
Shubham Jain