Java typecasting and instanceof and typecasting

Examples of instanceof and typecasting for object types.


import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Typecasting {

	/**
	 * The program demonstrates instanceof and typecasting
	 */
	public static void main(String[] args) {
		List<Integer> list1 = new ArrayList<Integer>();
		List<Integer> list2 = new Stack<Integer>();
		
		if (list1 instanceof List) { //Note: list1 instanceof List<Integer>
									 // doesn't compile: cannot use generics 
									 // in instanceof
			System.out.println("list1 is an instance of List");
		} else {
			System.out.println("list1 is not an instance of List");
		}
		
		if (list2 instanceof List) {
			System.out.println("list2 is an instance of List");
		} else {
			System.out.println("list2 is not an instance of List");
		}
		
		if (list1 instanceof ArrayList) {
			System.out.println("list1 is an instance of ArrayList");
		} else {
			System.out.println("list1 is not an instance of ArrayList");
		}
		
		if (list2 instanceof ArrayList) {
			System.out.println("list2 is an instance of ArrayList");
		} else {
			System.out.println("list2 is not an instance of ArrayList");
		}
		
		// typecasting: 
		// list2.push(2); doesn't compile since list2 is of type List and 
		// doesn't have push() method. Need to typecast in order to call push():
		Stack<Integer> theStack = (Stack<Integer>) list2;  // note that <Integer> in the cast
									// is required but the type doesn't actually get checked
		theStack.push(2);
		// or you can avoid using a variable:
		((Stack<Integer>) list2).push(5);
		
		// checking that the elements are actually in list2:
		System.out.println(list2);
		
		Stack<Integer> anotherStack; // declaring a stack outside of try/catch
				                     // to avoid variable scope issues 
		// if the object is of the wrong type, typecasting throws an exception:
		try {
			anotherStack = (Stack<Integer>) list1; 
		} catch (ClassCastException e) {
			System.out.println(e);
		}
		
		// if you are not sure whether a given object is of the right type,
		// use instanceof before typecasting:
		if (list1 instanceof Stack) {
			anotherStack = (Stack<Integer>) list1; 
		} else {
			System.out.println("Cannot cast list1 to Stack");
		}
	}

}

Using typecasting in equals method

Add the equals method to the Card class that tests for value and suit equality.


public class TestCardEquals {

	public static void main(String[] args) {
		Card aceSpades = new Card("Spades", "A");
		Card aceDiamonds = new Card("Diamonds", "A");
		Card anotherAceSpades = new Card("Spades", "A"); // someone's cheating
		
		// expect false
		System.out.println(aceSpades.equals(aceDiamonds));
		// expect true
		System.out.println(aceSpades.equals(anotherAceSpades));
		// expect false
		System.out.println(aceSpades.equals("Ace of Spades"));
	}

}


public class Card {

	final private String suit;
	final private String value;
	private int numericValue = 0;
	final private String[] arr = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};

	public Card(String suit, String value){
		this.suit = suit;
		this.value = value;
		for (int i = 0; i < 13; i++) {
			if (arr[i].equals(value)) {
				numericValue = i + 2;			
			}
		}
//		this.numericValue = arr.indexOf(value) + 2;
	}

	public String getSuit(){
		return suit;
	}

	public String getValue(){
		return value;
	}

	public int getNumericValue(){
		return numericValue;
	}

	public String toString(){
		return value + " of " + suit;
	}

	public int compareTo(Card that){
		return this.numericValue - that.numericValue;
        }

        public boolean equals(Object other) {
		if (!(other instanceof Card)) {
			return false;
		}
		
		Card otherCard = (Card) other;
	        return (this.value.equals(otherCard.value) &&
				    this.suit.equals(otherCard.suit));
	}
}

CSci 2101 course web site.

The views and opinions expressed in this page are strictly those of the page author. The contents of this page have not been reviewed or approved by the University of Minnesota.