Solved

Container for different primitive types and type casting

Posted on 2009-05-17
8
577 Views
Last Modified: 2013-11-12
Using java 6, I want to create a class that will contain a two dimensional arrays of different types. It should work for int, double and boolean types, and it should have methods for getting this array as another type.

I tried doing this using generics, but I'm not sure if this is the best way. When using generics i'm not able to use primitive types. And when I use wrapper classes type casting is not that easy. I cannot cast from Integer to Double.

Any suggestions to how I can do this a better way?

public class ArrayContainer<T>

{
 

	protected T[][] array;
 

	public ArrayContainer( T[][] array)

	{

		this.array = array;

	}
 

	public T[][] getArray()

	{

		return array;

	}
 

	public void setArray( T[][] pattern )

	{

		this.pattern = pattern;

	}

	

	public Double[][] getArrayAsDouble()

	{

		if (arrayinstanceof Double[][])

		{

			return (Double[][]) array;

		}

		else if (array instanceof Integer[][])

		{

			return (IntegerToDouble(array));

		}

                .....
 

		return null;

	}
 

       public int getArraryAsInt()

       {

       }

	protected Double[][] IntegerToDouble(T[][] values) 

	{

	    ....

	}

	.....

}

Open in new window

0
Comment
Question by:jstakk
  • 4
  • 2
  • 2
8 Comments
 
LVL 86

Expert Comment

by:CEHJ
ID: 24405881
You can't cast arrays. You'd need to create an array of the correct type and copy the elements
0
 
LVL 2

Author Comment

by:jstakk
ID: 24405903
Yes I know. But I still can't cast each element directly from Integer to Double.

This should be done to very large arrays, so it has to be efficient.
Integer i = new Integer(1000);

Double d = (double) (int) i;

Open in new window

0
 
LVL 3

Expert Comment

by:hazgoduk
ID: 24405910
You can do new Double(i) surely...?

Or you could have Class arrayClass = Object.class and have a setClass(Class class) method. Then just call setClass(Integer.class) and in your setValues you can check the values being entered are instanceof class
0
 
LVL 86

Accepted Solution

by:
CEHJ earned 500 total points
ID: 24405928
I think perhaps you have something like this in mind (always trickyish but works)?
public class ArrayContainer<T> {

    protected T[][] array;
 

    public ArrayContainer(T[][] array) {

        this.array = array;

    }
 

    public T[][] getArray() {

        return array;

    }
 

    public void setArray(T[][] array) {

        this.array = array;

    }
 

    public Double[][] getArrayAsDouble() {

        Double[][] result = new Double[array.length][];

	for(int i = 0;i < result.length;i++) {	

	    result[i]  = new Double[array[i].length];

	    for(int j = 0;j < result[i].length;j++) {

		result[i][j] = ((Number)array[i][j]).doubleValue();

	    }

	}

        return result;

    }
 

    public static void main(String[] args) {	

	Integer[][] ii  = { 

	    { 1, 2, 3, 4 },

	    { 5, 6, 7, 8}

	};

	ArrayContainer ac = new ArrayContainer<Integer>(ii);

	Double[][] conv = ac.getArrayAsDouble();

	for (Double[] a : conv) {

	    System.out.println(java.util.Arrays.toString(a));

	}

    }

}

Open in new window

0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 2

Author Comment

by:jstakk
ID: 24405955
@hazgoduk: The constructor for Double takes either a double, or a String as argument. Using an Integer in the constructor will work but it will call the Integer's toString() method and then parse the string. Not very efficient. Your second suggestion is perhaps a good way to go, i'll look into that. Thank you.

@CEHJ:
Thats what I was looking for. Looks like a good solution to my problem. I'm gonna try it out.

Thank you both very much for you quick and good help.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 24405967
Why would you need a 'setClass' method?
0
 
LVL 3

Expert Comment

by:hazgoduk
ID: 24405972
I must admit I didn't look at the code very much as I just woke up! You would indeed not need a setClass method. Just set the class based on the type sent in the contructor
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 24406381
:-)
0

Featured Post

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

Suggested Solutions

The CRUD Functions CRUD, meaning "Create, Read, Update, Delete (http://en.wikipedia.org/wiki/Create,_read,_update_and_delete)" is a common term to data base developers.  It describes the essential functions of data base table maintenance.  This art…
Introduction A frequently used term in Object-Oriented design is "SOLID" which is a mnemonic acronym that covers five principles of OO design.  These principles do not stand alone; there is interplay among them.  And they are not laws, merely princ…
Video by: Michael
Viewers learn about how to reduce the potential repetitiveness of coding in main by developing methods to perform specific tasks for their program. Additionally, objects are introduced for the purpose of learning how to call methods in Java. Define …
The viewer will learn how to implement Singleton Design Pattern in Java.

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now