Sunday, January 19, 2014

Menggunakan generic untuk conversi list di Java

Salah satu dari kegunaan generic di java adalah untuk mengkonversi list objek tipe tertentu menjadi list objek tipe turunannya.  Jika kita ingin mengkonversi list yang berisi objek tipe A menjadi list objek tipe B (yang mengekstends A), itu tidak bisa dilakukan secara langsung, seperti contoh berikut

package fjr.test.testgeneric;
public class A {
String name;
public A(String name){
this.name = name;
}
public String toString(){
return name;
}
}
view raw A .java hosted with ❤ by GitHub
package fjr.test.testgeneric;
public class B extends A{
int id;
public B(String name , int id){
super(name);
this.id = id;
}
public String toString(){
return super.toString()+ " | " + Integer.toString(id);
}
}
view raw B.java hosted with ❤ by GitHub
package fjr.test.testgeneric;
import java.util.ArrayList;
public class TestConvert {
public TestConvert(){
ArrayList<A> listA = new ArrayList<>();
for(int i=0; i < 10; i++){
listA.add(new A("anak "+Integer.toString(i)));
}
ArrayList<B> list = convert(listA);
for(int i=list.size() - 1; i>=6; i--){
list.remove(i);
}
for(int i=0; i< list.size(); i++){
System.out.println(list.get(i));
}
}
public ArrayList<B> convert(ArrayList<A> listA){
ArrayList<B> listHasil = (ArrayList<B>) listA;
return listHasil;
}
public static void main(String[] args){
new TestConvert();
}
}
Pada contoh di atas method convert tersebut tidak bisa dituliskan seperti itu, walaupun kelas B mengekstends kelas A. Yang harus dilakukan adalah dengan menggunakan generic seperti potongan berikut

package fjr.test.testgeneric;
import java.util.ArrayList;
public class TestConvert {
public TestConvert(){
ArrayList<A> listA = new ArrayList<>();
for(int i=0; i < 10; i++){
listA.add(new A("anak "+Integer.toString(i)));
}
ArrayList<B> list = convert(listA);
for(int i=list.size() - 1; i>=6; i--){
list.remove(i);
}
for(int i=0; i< list.size(); i++){
System.out.println(list.get(i));
}
}
public <T> ArrayList<T> convert(ArrayList<A>listA){
ArrayList<T> listHasil = (ArrayList<T>)listA;
return listHasil;
}
public static void main(String[] args){
new TestConvert();
}
}
Dan itupun hanya berlaku jika kelas B mengekstends kelas A. Jika tidak akan terjadi error misalnya:

package fjr.test.testgeneric;
import java.util.ArrayList;
public class TestConvert {
public TestConvert(){
ArrayList<A> listA = new ArrayList<>();
for(int i=0; i < 10; i++){
listA.add(new A("anak "+Integer.toString(i)));
}
ArrayList<String> list = convert(listA);
for(int i=list.size() - 1; i>=6; i--){
list.remove(i);
}
for(int i=0; i< list.size(); i++){
System.out.println(list.get(i));
}
}
public <T> ArrayList<T> convert(ArrayList<A>listA){
ArrayList<T> listHasil = (ArrayList<T>)listA;
return listHasil;
}
public static void main(String[] args){
new TestConvert();
}
}
Yang akan menghasilkan output