�@
Go to Contents Go to Java Page
J2SE 1.5 Ղ̌
�@
�@

Generics

�@
�@
Tiger Genrics �Ƃ̓i�����낤
�@
�@

Generics �͂��łɎG���Ȃǂʼn���L����������Ă���̂ł����m�̂������������Ǝv���܂��B

Generics �Ƃ����̂� C++ �̃e���v���[�g�@�\�̂悤�ȋ@�\�ŁA�ЂƂ��Ƃł����΃N���X (�C���^�t�F�[�X)�A���\�b�h�̃p�����[�^���Ƃ������Ƃ��ł��܂��B

�Ƃ����Ă��悭������Ȃ��ł��ˁB

����ł͎��ۂɗ�������܂��傤�B

�R���N�V�����͗v�f�� Object �N���X�̃I�u�W�F�N�g�Ƃ��ĕێ����邽�߂ɁA�g���Ƃ��ɂ͂��������L���X�g���s��Ȃ��Ă͂����܂���B

    List list = new ArrayList();
 
    list.add(new Integer(10));
 
    int x = ((Integer)list.get(0)).intValue();  // �L���X�g���K�v

�Ō�̍s�͔��ɏX���Ȃ��Ă��܂��܂��B

Generics ���g���Ƃ‚��̂悤�ɂȂ�܂��B

    List<Integer> list = new ArrayList<Integer>();
 
    list.add(new Integer(10));
 
    int x = list.get(0).intValue();  // �L���X�g���s�K�v

�ƂĂ��������肵�܂����B

1 �s�ڂ� <Integer> �Ƃ����̂� Generics �̕\�L�ł��B����͂ǂ������Ӗ����Ƃ����ƁA<Integer> �ŏC�����ꂽ List �I�u�W�F�N�g�͕ێ�����v�f�����ׂ� Integer �I�u�W�F�N�g�ɂȂ�Ƃ������Ƃ������Ă��܂��B���̂��߃L���X�g������Ȃ��Ȃ��Ă���̂ł��B

�����߂ɂ̓L���X�g������Ȃ��Ȃ��������ł����A�v���O�����̕ێ�Ƃ����ϓ_���炷��Ƃ����Əd�v�ȓ_������܂��B

���Ƃ��Ύ��̃R�[�h�͖��Ȃ��R���p�C���ł��܂��B

�A�v���P�[�V�����̃\�[�X CastTest.java

 

import java.util.ArrayList;
import java.util.List;
 
public class CastTest {
    public static void main(String[] args) {
        List list = new ArrayList();
 
        list.add(new Integer(10));
  
        String str = (String)list.get(0);
    }
}

�������A��������s����Ɠ�����O�ł��� ClassCastException ���������Ă��܂��܂��B

C:\JSR014>javac CastTest.java
Exception in thread "main" java.lang.ClassCastException
        at CastTest.main(CastTest.java:10)

�悤����ɂ��̊ԈႢ�̓v���O���������s���Ȃ����蔭������Ȃ��̂ŁA�f�o�b�O���ʓ|�ɂȂ�܂��B�R���p�C�����Ƀ`�F�b�N�ł���΁A�����Ƃ����܂ɏC���ł���̂ł���...

����� Generics ���g�p����΂‚��̂悤�ɏ������Ƃ��ł��܂��B

�A�v���P�[�V�����̃\�[�X CastTest2.java

 

import java.util.ArrayList;
import java.util.List;
 
public class CastTest2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
 
        list.add(new Integer(10));
  
        String str = list.get(0);
    }
}

������R���p�C�����܂��B

C:\JSR014>javac CastTest.java
CastTest2.java:8: �V���{���������ł��܂���B
�V���{��: ���\�b�h add (java.lang.Integer)
�ꏊ    : �C���^�t�F�[�X ��
        list.add(new Integer(10));
            ^
�G���[ 1 ��

C:\JSR014>

�R���p�C�����ɃR���p�C���G���[���o�邽�߁A�܂��������v�f��ێ������悤�Ƃ��Ă������Ƃ������킩��܂��B������Ƃ����Ⴂ�̂悤�ȋC�����܂����A���ꂪ�ێ琫�ɂ͑傫�ȈႢ�ɂȂ�̂ł��B

Generics �� JCP �ŕW�������肳��Ă��܂��BJSR-014 �Ȃ̂ł����Ԃ񑁂������� JCP �ɓo�^���ꂽ�̂ł����A�Ȃ��Ȃ��܂Ƃ܂�܂���ł����B����� Tiger �ŃR�A�ɂƂ肱�܂�܂��B

Generics �̎d�l�� JCP ����_�E�����[�h�ł��܂��B

JSR-014 Add Generic Types To The Java Programming Language http://jcp.org/en/jsr/detail?id=14

�Ȃ�ׂ��A�ŐV�̏���ǂ������Ă������Ƃ͎v���Ă��܂����A��������Ă��镔��������܂����烁�[�����������B

 

�@
�@
Tiger �ǂ�ǂ�g���� �N���X��
�@
�@

Generics �̎g�������ȒP���Ƃ������Ƃ͈�Ԃ͂��߂̗Ⴉ�番����Ǝv���܂��B�����ł́A�����‚���������Ȃ���A����������Ǝg���������Ă����܂��傤�B

�܂��̓R���N�V�����֘A�Ŏg���Ă݂܂��傤�B�R���N�V������ Generics �ɂ���Ă����Ƃ��ω����������Ȃ̂ŁA�������}������΂������v�B

�A�v���P�[�V�����̃\�[�X
Generics ���g�p
Genrics �g�p

 

List

�͂��߂̗�� List �C���^�t�F�[�X�� ArrayList �N���X�̗�ł��B�P�ɕ�����̘A��������Ă��܂��B���܂ł̏������ł͎��̂悤�ɂȂ�܂��B���Ȃ݂ɃN���X���� WO �� without �̂��Ƃł��B

import java.util.ArrayList;
import java.util.List;
 
public class WOGenericsSample1 {
    public static void main(String[] args) {
        List list = new ArrayList();
        
        for(int i = 0; i < args.length; i++) {
            list.add(args[i]);  // �^�`�F�b�N���s���Ȃ�
        }
 
        StringBuffer buffer = new StringBuffer();
        for(int i = 0; i < list.size(); i++) {
            String tmp = (String)list.get(i); // �L���X�g���K�v
            buffer.append(tmp);
        }
 
        System.out.println(buffer);
    }
}

����� Generics �ŏ����Ǝ��̂悤�ɂȂ�܂��B�Ԃ̕����� Generics �̐錾�����ł��B

import java.util.ArrayList;
import java.util.List;
 
public class GenericsSample1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        
        for(int i = 0; i < args.length; i++) {
            list.add(args[i]);   // �^�`�F�b�N���s����
        }
 
        StringBuffer buffer = new StringBuffer();
        for(int i = 0; i < list.size(); i++) {
            String tmp = list.get(i); // �L���X�g�͂���Ȃ�
            buffer.append(tmp);
        }
 
        System.out.println(buffer);
    }
}

���X�g�ɗv�f��lj�����Ƃ��ɂ̓p�����[�^�̌^ (�����ł� String) �ł��邩�ǂ����`�F�b�N����܂��B�t�ɁAGenerics ���g����Ƃ��ɁAGenerics ���g��Ȃ��ŃR���p�C�������

C:\JSR014\examples>javac WOGenericsSample1.java
��: WOGenericsSample1.java �̑���́A���`�F�b�N�܂��͈��S�ł͂���܂���B
��: �ڍׂɂ‚��ẮA-Xlint:unchecked �I�v�V�������w�肵�čăR���p�C�����Ă�����
���B

C:\JSR014\examples>

�ƕ\������܂��B-warnunchecked �I�v�V�������‚��ăR���p�C�������

C:\JSR014\examples>javac -Xlint:unchecked WOGenericsSample1.java
WOGenericsSample1.java:9: �x��: raw �^ java.util.List �̃����o�Ƃ��Ă� add(E) ��
�Ăяo���͖��m�F�ł��B
            list.add(args[i]);  // �^�`�F�b�N���s���Ȃ�
                ^
�x�� 1 ��

C:\JSR014\examples>

�ƕ\������āA�^�`�F�b�N����Ȃ����Ƃ��x������܂��B

get ����Ƃ��ɃL���X�g������Ȃ��̂́A�O�q�̒ʂ�B

 

Iterator

���� Iterator �C���^�t�F�[�X���g�p������ł��B���܂ł̋L�q�����Ǝ��̂悤�ɂȂ�܂��B

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class WOGenericsSample2 {
    public static void main(String[] args) {
        List list = new ArrayList();
         
        for(int i = 0; i < args.length; i++) {
            list.add(args[i]);  // �^�`�F�b�N���s���Ȃ�
        }
 
        StringBuffer buffer = new StringBuffer();
        Iterator it = list.iterator();
        while(it.hasNext()) {
            String tmp = (String)it.next(); // �L���X�g���K�v
            buffer.append(it.next());
        }
 
        System.out.println(buffer);
    }
}

Collection#iterator ���\�b�h�͖߂�l���p�����[�^�����ꂽ Iterator �I�u�W�F�N�g�ɂȂ�܂��BGenerics �ŏ����Ȃ�����

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class GenericsSample2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        
        for(int i = 0; i < args.length; i++) {
            list.add(args[i]);  // �^�`�F�b�N���s����
        }
 
        StringBuffer buffer = new StringBuffer();
        Iterator<String> it = list.iterator();
		
        while(it.hasNext()) {
            buffer.append(it.next()); // �L���X�g������Ȃ�
        }
 
        System.out.println(buffer);
    }
}

�L���X�g������Ȃ��Ƃ����̂́A�����Ԃ�y�ɂȂ�܂��B�ق�ƂɁB

 

����q�p�����[�^

���āA���� 2 �d���X�g������Ă݂܂��傤�B���X�g�̗v�f�����X�g�Ƃ������X�g�ł��B���̃v���O�����̓g�����v�̃J�[�h�����Ƃ�����ł��B

import java.util.ArrayList;
import java.util.List;
 
public class WOGenericsSample3 {
    public final static String[] suits = {"S", "C", "H", "D"};
 
    public static void main(String[] args) {
        List deck = new ArrayList();
 
        for (int i = 0; i < suits.length; i++) {
            List row = new ArrayList();
            for (int j = 1; j <= 13; j++) {
                if (j == 1) {
                    row.add(suits[i] + "A"); // �^�`�F�b�N���s���Ȃ�
                } else {
                    row.add(suits[i] + j);   // �^�`�F�b�N���s���Ȃ�
                }
            }
            deck.add(row);  // �^�`�F�b�N���s���Ȃ�
        }
         
        for (int i = 0; i < suits.length; i++) {
            for (int j = 0; j < 13; j++) {
                String card = (String)((List)deck.get(i)).get(j);
                                                     // �Ƃ��Ă��ʓ|
} System.out.println(); } } }

�v�f�����o���̂� 2 ����L���X�g����K�v������܂��B�ʓ|�������ł����A������ɂ����ł��ˁB

����� Generics �ŏ����Ǝ��̂悤�ɂȂ�܂��B2 �d���X�g�Ȃ̂ŁA�p�����[�^�̒��Ƀp�����[�^�������N���X������Ƃ�������q�\���ɂȂ��Ă��܂��B

import java.util.ArrayList;
import java.util.List;
 
public class GenericsSample3 {
    public final static String[] suits = {"S", "C", "H", "D"};
 
    public static void main(String[] args) {
        List<List<String>> deck = new ArrayList<List<String>>();
 
        for (int i = 0; i < suits.length; i++) {
            List<String> row = new ArrayList<String>();
            for (int j = 1; j <= 13; j++) {
                if (j == 1) {
                    row.add(suits[i] + "A"); // �^�`�F�b�N���s����
                } else {
                    row.add(suits[i] + j);   // �������^�`�F�b�N
                }
            }
            deck.add(row);  // �������A�����ł��^�`�F�b�N���s����
        }
         
        for (int i = 0; i < suits.length; i++) {
            for (int j = 0; j < 13; j++) {
                System.out.print(deck.get(i).get(j) + " "); // �ȒP
            }
            System.out.println();
        }
    }
}

Generics ���g������`�̕�����������ƌ��ɂ�����������܂���B�����΃i���ł�����܂��� ^^;; �錾�� 1 �񂾂��ł����Aget ����͉̂��x�����邩������Ȃ��̂ł��B

get �̕����̊Ȍ����͊����I�ł��B

 

�����p�����[�^

�p�����[�^�̓���q���ł��邱�Ƃ͕�����܂����̂ŁA�����̃p�����[�^�̗�����Ɏ����܂��傤�B

�p�����[�^�� 2 �Žg�����̂Ƀ}�b�v������܂��B�}�b�v�͂����m�̂悤�ɃL�[�ƒl�̃y�A�ɂȂ�܂����A���̗����Ƃ��p�����[�^�Ƃ��邱�Ƃ��ł��܂��B

�܂��͍��܂ł̏������B

import java.util.HashMap;
import java.util.Map;
 
public class WOGenericsSample4 {
    public final static String[] num = {"zero",
                                        "one",
                                        "two",
                                        "three",
                                        "four",
                                        "five"};
  
    public static void main(String[] args) {
        Map map = new HashMap();
 
        for (int i = 0; i < num.length; i++) {
            map.put(num[i], new Integer(i)); // �^�`�F�b�N�͍s���Ȃ�
        }
         
        for (int i = 0; i < num.length; i++) {
            // �L���X�g���K�v & �^�`�F�b�N�Ȃ�
            Integer v = (Integer)map.get(num[i]); 
            System.out.println(num[i] + " : " + v);
        }
    }
}

Generics �ŏ������������̂����ł��B�����̃p�����[�^������ꍇ�̓J���}�ŋ�؂��ď����܂��B

import java.util.HashMap;
import java.util.Map;
 
public class GenericsSample4 {
    public final static String[] num = {"zero",
                                        "one",
                                        "two",
                                        "three",
                                        "four",
                                        "five"};
 
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();
 
        for (int i = 0; i < num.length; i++) {
            map.put(num[i], new Integer(i)); // �^�`�F�b�N���s����
        }
         
        for (int i = 0; i < num.length; i++) {
            // �L���X�g�͂���Ȃ� & �^�`�F�b�N����
            Integer v = map.get(num[i]); 
            System.out.println(num[i] + " : " + v);
        }
    }
}

Generics ���g���� put ���\�b�h�Ō^�`�F�b�N���s���܂��B�L�[�ƒl�̗����Ƃ��`�F�b�N����܂��B

�܂��Aget ����Ƃ����L�[�̌^�`�F�b�N���s���܂��B

�ǂ��ł����AGenerics ���g���̂�����Ȃɖʓ|�ł͂Ȃ����Ƃ��������肾�Ǝv���܂��B���͏������@�I�Ȃ��Ƃ𒲂ׂĂ݂܂��傤�B

 

�@
�@
Tiger ����Ȃ��Ƃł��邩�� ?
�@
�@

���܂ł͂��܂�l���邱�ƂȂ� Generics ���g���Ă��܂������A���낢��ƋC�ɂȂ�Ƃ��������܂��B�������`�F�b�N���Ă݂܂��傤�B

 

�Ȃɂ��p�����[�^�Ƃł��邩

���܂ł̗�݂͂ȃp�����[�^�Ƃ��ăN���X�������̓C���^�t�F�[�X���g�p���Ă��܂����B���ꂶ��A����Ȃ̂�

    List<int>    // NG

�p�����[�^�Ɏg�p�ł���̂͂����܂ł��A�N���X���C���^�t�F�[�X�����Ńv���~�e�B�u�^�͎g�p�ł��܂���B�������A���b�p�[�N���X���g�p���邱�Ƃ͂ł��܂��B

�������A����Ƀp�����[�^�̐��𑝂₷���Ƃ��ł��܂���List �C���^�t�F�[�X�̃p�����[�^�� 1 �‚����Ȃ̂ŁA���̗�͊ԈႢ�ł��B

    List<String, Integer>    // NG

 

�p�����[�^�����ꂽ�N���X�͌��̃N���X�Ƌ�ʂ����̂�

C++ �̃e���v���[�g�̓p�����[�^�������ƁA�Ⴄ�N���X�Ƃ��ĔF������܂��BJava �ł͂ǂ��ł��傤�B

���̗�Ŋm���߂Ă݂܂��傤�B

import java.util.ArrayList;
 
public class ClassDiffTest1 {
    public static void main(String[] args) {
        ArrayList<String> clist = new ArrayList<String>();
        ArrayList<Integer> ilist = new ArrayList<Integer>();
 
        if (clist.getClass().equals(ilist.getClass())) {
            System.out.println("Classes are Same: "
                               + clist.getClass());
        } else {
            System.out.println("Classes are Different: "
                               + clist.getClass() + " " 
                               + ilist.getClass());
        }
    }
}

�����������s�B

C:\JSR014\examples>java ClassDiffTest1
Classes are Same: class java.util.ArrayList
C:\JSR014\examples>

����A�ꏏ���B

���ꂶ��A����Ȃ��Ƃ��ł���̂ł��傤���B

import java.util.ArrayList;
 
public class ClassDiffTest2 {
    // �N���X�������Ȃ����͂ł���̂��낤��
    public static void main(String[] args) {
        ArrayList<String> clist = new ArrayList<String>();
        ArrayList<Integer> ilist = new ArrayList<Integer>();
 
        clist = ilist;
    }
}

������R���p�C������ƁA����ς�_���ł��� ^^;;

C:\JSR014\examples>javac ClassDiffTest2.java
ClassDiffTest2.java:9: �݊����̂Ȃ��^
���o�l  : java.util.ArrayList<java.lang.Integer>
���Ғl  : java.util.ArrayList<java.lang.String>
        clist = ilist;
                ^
�G���[ 1 ��

C:\JSR014\examples>

�N���X�͓����Ȃ̂ɑ���ł��Ȃ��Ƃ����̂��ςȊ����ł����A�܂�������O�ł��傤�B

���ꂶ��A�p�����[�^�����Ă��Ȃ��I�u�W�F�N�g�ɑ�����Ă݂܂��傤�B���Ȃ݂Ƀp�����[�^�����Ă��Ȃ����̂� Raw �^�C�v�Ƃ��������ł��B

import java.util.ArrayList;
 
public class ClassDiffTest3 {
 
    // �p�����[�^�����Ă��Ȃ��I�u�W�F�N�g�ɑ���ł��邩
    // �܂��A�^�`�F�b�N�͍s����̂��낤��
    public static void test1() {
        ArrayList list = new ArrayList();
        ArrayList<String> clist = new ArrayList<String>();
 
        list = clist;
 
        clist.add("A");
        String str = clist.get(0);
 
        clist.add(new Integer(1));
        Integer i = clist.get(1);
    }

    // �p�����[�^�����Ă��Ȃ��I�u�W�F�N�g��
    // �p�����[�^�������I�u�W�F�N�g�ɑ���ł��邩
    // �^�`�F�b�N��
    public static void test2() {
        ArrayList list = new ArrayList();
        ArrayList<String> clist = new ArrayList<String>();
 
        clist = list;
 
        clist.add("A");
        String str = clist.get(0);
 
        clist.add(new Integer(1));
        Integer i = clist.get(1);
    }
 
    public static void main(String[] args) {
        test1();
        test2();
    }
}

������R���p�C�������

C:\JSR014\examples>javac -Xlint:unchecked ClassDiffTest3.java
ClassDiffTest3.java:16: �V���{�������‚����܂���B
�V���{��: ���\�b�h add (java.lang.Integer)
�ꏊ    : java.util.ArrayList<java.lang.String> �� �N���X
        clist.add(new Integer(1));
             ^
ClassDiffTest3.java:17: �݊����̂Ȃ��^
���o�l  : java.lang.String
���Ғl  : java.lang.Integer
        Integer i = clist.get(1);
                             ^
ClassDiffTest3.java:27: �x��: java.util.ArrayList ���� java.util.ArrayList<java.
lang.String> �̑���͖��m�F�ł��B
        clist = list;
                ^
ClassDiffTest3.java:32: �V���{�������‚����܂���B
�V���{��: ���\�b�h add (java.lang.Integer)
�ꏊ    : java.util.ArrayList<java.lang.String> �� �N���X
        clist.add(new Integer(1));
             ^
ClassDiffTest3.java:33: �݊����̂Ȃ��^
���o�l  : java.lang.String
���Ғl  : java.lang.Integer
        Integer i = clist.get(1);
                             ^
�G���[ 4 ��
�x�� 1 ��

C:\JSR014\examples>

�p�����[�^�����ꂽ�I�u�W�F�N�g���p�����[�^�����Ă��Ȃ��I�u�W�F�N�g�ɑ�����邱�Ƃ� OK �̂悤�ł��B�t�͌x�����o�Ă���̂ŁA���܂��������߂ł��܂���B

�p�����[�^�����Ă��Ȃ��I�u�W�F�N�g�ɑ�����Ă��^�`�F�b�N�͂����ƍs���Ă���悤�ł��B�܂��A�L���X�g���g���K�v���Ȃ��悤�ł��B

�܂��A����킵���̂ł��������g�����͂�߂Ă����������������Ƃ͎v���܂����B

 

�L���X�g�͂ł��邩

������ł����̂ŁA�L���X�g�������Ă݂܂��傤�B

import java.util.List;
import java.util.ArrayList;
 
public class ClassCastTest1 {
    public static void main(String[] args) {
        ArrayList<Integer> ilist = new ArrayList<Integer>();
 
        List list = (List)ilist;
        list = (List<Integer>)ilist;
        list = (List<String>)ilist;
    }
}

�����A�Ō�� List<String> �̓_�����Ǝv���܂����AList �ւ̃L���X�g�͂ǂ��ł��傤���B���������A�R���p�C���B

C:\JSR014\examples>javac ClassCastTest1.java
ClassCastTest1.java:10: �ϊ��ł��Ȃ��^
���o�l  : java.util.ArrayList<java.lang.Integer>
���Ғl  : java.util.List<java.lang.String>
        list = (List<String>)ilist;
                             ^
�G���[ 1 ��

C:\JSR014\examples>

List �ւ̃L���X�g�͑���̗\�z�ʂ���v�ł��BList<String> �ւ̃L���X�g�͂���ς�_���ł��ˁB

 

�p�����[�^�����ꂽ�N���X��h���ł��邩

�p�����[�^�����ꂽ�Ƃ��Ă��A�N���X�Ƃ��Ĉ�����悤�Ȃ̂ŁA����Ȃ��Ƃ��ł��邩�ǂ��������Ă݂����Ȃ�܂����B

import java.util.ArrayList;
 
public class ClassExtendsTest1 {
    public static void main(String[] args) {
        A a = new A();
 
        a.add("abc");
        String str = a.get(0);
 
        a.add(new Integer(10));
        Integer i = (Integer)a.get(1);
    }
}

class A extends ArrayList<String> {}

�悤����Ƀp�����[�^�����ꂽ�N���X��h���ł��邩�A�������̓p�����[�^�����ꂽ�C���^�t�F�[�X���C���v�������g�ł��邩�Ƃ������Ƃł��B

�R���p�C�����Ă݂�ƁA���̂悤�ɂȂ�܂����B

C:\JSR014\examples>javac ClassExtendsTest1.java
ClassExtendsTest1.java:10: �V���{�������‚����܂���B
�V���{��: ���\�b�h add (java.lang.Integer)
�ꏊ    : A �̃N���X
        a.add(new Integer(10));
         ^
ClassExtendsTest1.java:11: �ϊ��ł��Ȃ��^
���o�l  : java.lang.String
���Ғl  : java.lang.Integer
        Integer i = (Integer)a.get(1);
                                  ^
�G���[ 2 ��

C:\JSR014\examples>

�h�������������Ɋւ��Ă̓R���p�C���G���[�͏o�Ă��Ȃ��悤�ł��BA �͕��ʂ̃N���X�̂悤�Ɍ����܂����A�����ƌ^�`�F�b�N��L���X�g���s�v�ɂȂ��Ă��܂��B10 �s�ڂƁA11 �s�ڂ��R�����g�A�E�g���Ď��s���Ă݂�Ƃ����Ǝ��s�ł��܂����B

�C���^�t�F�[�X�ł�����Ă݂܂����B�悭������Ȃ��̂� next ���\�b�h�̖߂�l�ł��B���X�� Iterator �C���^�t�F�[�X�̏ꍇ�̖߂�l�� Object �^�ł��B�ł��A�p�����[�^��������p�����[�^�̌^�ɂȂ�͂�������ł��B

import java.util.ArrayList;
import java.util.Iterator;
 
public class ClassExtendsTest2 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("abc");
        list.add("efg");
        list.add("hij");
 
        B b = new B(list);
 
        while(b.hasNext()) {
            String str = b.next();
            System.out.println(str);
        }
    }
}

class B implements Iterator<String> {
    private Iterator<String> it;
 
    public B(ArrayList<String> list) {
        it = list.iterator();
    }
 
    public boolean hasNext() {
        return it.hasNext();
    }
 
//    public String next() {
    public Object next() {
        return it.next();
    }
 
    public void remove() {
        it.remove();
    }
}

�Ƃ肠�����A���̂܂܂ŃR���p�C�����Ă݂܂��傤�B

C:\JSR014\examples>javac ClassExtendsTest2.java
ClassExtendsTest2.java:14: �݊����̂Ȃ��^
���o�l  : java.lang.Object
���Ғl  : java.lang.String
            String str = b.next();
                               ^
ClassExtendsTest2.java:20: B �� abstract �łȂ��Ajava.util.Iterator ���� abstrac
t ���\�b�h next() ���I�[�o�[���C�h���܂���B
class B implements Iterator {
^
ClassExtendsTest2.java:32: B �� next() �� java.util.Iterator �� next() ��������
���܂���B�݊����̂Ȃ��߂�l�̌^���g�����Ƃ��܂����B
���o�l  : java.lang.Object
���Ғl  : java.lang.String
    public Object next() {
                  ^
�G���[ 3 ��
 
C:\JSR014\examples>

��͂�Anext ���\�b�h�̖߂�l�̓p�����[�^�� String �ɂȂ�悤�ł��B�����ύX���Ď��s���Ă݂��

C:\JSR014\examples>java ClassExtendsTest2
abc
efg
hij
C:\JSR014\examples>

�Ƃ����Ǝ��s�ł��܂����B

�������A���̂悤�Ƀp�����[�^�����ꂽ�N���X��C���^�t�F�[�X��h���E�C���v�������g���Ă����܂�Ӗ�������܂���B���񂾂�����p�����[�^�������܂ܒ�`�����ق��������Ǝv���܂��B�Ƃ����킯�ŁA������͎��ۂɎ����Ńp�����[�^�������N���X������Ă݂܂��傤�B

 

�@
�@
Tiger Generics �ȃN���X�E���\�b�h�����삷��
�@
�@

���܂ł͎g�����΂��肾�����̂ł����A��������� Generics �𗘗p���ăN���X�A�C���^�t�F�[�X�A���\�b�h������Ă݂܂��傤�B

 

�N���X�̃p�����[�^��

�܂��̓N���X�A�C���^�t�F�[�X����ł��B�N���X�A�C���^�t�F�[�X�̏ꍇ�A�N���X�̒�`�̕����ŃN���X���A�C���^�t�F�[�X���̒���� <T> �̂悤�Ƀp�����[�^���‚��Đ錾���܂��B�ʂɃp�����^�[�̌^���� T �łȂ��ăi���ł������̂ł����A����I�ɂ̓A���t�@�x�b�g�̑啶�� 1 �������g�p���邱�Ƃ������ł��B

public class Something<T> {
    protected T t;
 
    public Something(T t) {
        this.t = t;
    }
 
    public T get() {
        return t;
    }

}

�N���X�̒��ł̓p�����[�^�̌^�͕��ʂ̌^�Ƃ��Ďg�p���邱�Ƃ��ł��܂��B���̂��߁A�v���p�e�B�⃁�\�b�h�̈����A���\�b�h�̖߂�l�A�e���|�����ϐ��ȂǂɎg�p���邱�Ƃ��ł��܂��B

�C���^�t�F�[�X�ł����l�ł��B

public interface IAny<S> {
    public S get();
}

�h���N���X��C���^�t�F�[�X�̃C���v�������g���ł��܂��B

public class Anything<T> extends Something<T> implements IAny<T> {
    public Anything(T t) {
        super(t);
    }
 
    public T get() {
        return t;
    }

    public void set(T t) {
        this.t = t;
    }
}

�ȒP�ł���B

���������Ƌ��������ƂɃ��C���h�J�[�h���‚�����̂ł��B���C���h�J�[�h�� ? �ŕ\�킵�܂��B

import java.util.List;
 
public class Everything<T> {
    private List<T> list;
  
    public Everything(List<T> list) {
        this.list = list;
    }
 
    public void set(List<? extends T> s) {
        list = (List<T>)s;
    }
 
    public void dainyuu(List<? super T> s) {
        s = list;
    }
}

<? extends T> �Ƃ����̂́uT �̔h���N���X��������Ȃ�ł������v�Ƃ������Ƃł��B<? super T> �Ƃ����������� T �̃X�[�p�N���X��������Ȃ�ł������Ƃ������Ƃł��B�����Ƃ��C���^�t�F�[�X���g�����Ƃ��ł��܂��B

�Ƃ͂������̂� List<? extends T> �� List<T> �ɃL���X�g����ƃR���p�C�����Ɍx������܂��B

�܂��A�P�� <?> �Ə����Ă��ׂẴN���X�Ƃ������������ł��܂����A����̓p�����[�^���������\�b�h�Ŏg���邱�Ƃ������̂ŁA�܂���Ő������܂��B

������Ǝ����Ă݂܂��傤�B

import java.util.ArrayList;

public class WildcardSample {
    public static void main(String[] args) {
        Everything<B> e = new Everything<B>(new ArrayList<B>());
 
        e.set(new ArrayList<A>));
        e.set(new ArrayList<B>));
        e.set(new ArrayList<C>));
 
        e.dainyuu(new ArrayList<A>));
        e.dainyuu(new ArrayList<B>));
        e.dainyuu(new ArrayList<C>));
    }
}
 
class A {}
class B extends A {}
class C extends B {}

A �N���X�̔h���N���X�� B�B���̔h���N���X�� C ��p�ӂ��āAEverything �N���X�� get/set ���\�b�h���R�[�����Ă݂�Ƃ�����ł��B

������R���p�C�������

C:\JSR014\examples>javac -Xlint:unchecked WildcatdSample.java
WildcardSample.java:7: set(java.util.List<? extends B>) (Everything<B> ��) �� (j
ava.util.ArrayList<A>) �ɓK�p�ł��܂���
        e.set(new ArrayList<A>());
         ^
WildcardSample.java:13: dainyuu(java.util.List<? super B>) (Everything<B> ��) ��
 (java.util.ArrayList<C>) �ɓK�p�ł��܂���
        e.dainyuu(new ArrayList<C>());
         ^
.\Everything.java:11: �x��: �^ java.util.List<T> �ւ̃L���X�g�͖��m�F�ł��B
        list = (List<T>)s;
                        ^
�G���[ 2 ��
�x�� 1 ��
 
C:\JSR014\examples>

�G���[�� 2 �‚ŁA�x���� 1 �B�x���͑O�q�����悤�� List<? extends T> �� List<T> �ɃL���X�g�������Ƃɂ��܂��B

�G���[�� List<? extends B> �����҂���Ă����Ƃ���� List<A> �������Ƃ����̂� 1 �BA �� B �̃X�[�p�N���X�Ȃ̂ł���͂��߂ł��B

���� List<? super B> �����҂���Ă����Ƃ���� List<C> �������Ƃ������Ƃł��BC �� B �̔h���N���X�Ȃ̂ł���ς�_���ł��ˁB

 

���\�b�h�̃p�����[�^��

���āA���̓��\�b�h�̕��ł��B�N���X���p�����[�^������Ă��Ȃ��Ă��A���\�b�h�������p�����[�^�����邱�Ƃ��ł��܂��B

���\�b�h���p�����[�^������ɂ� public �� private �� static �Ȃǂ̌�A�߂�l�̑O�� <�p�����[�^��> ���L�q���܂��B �N���X�̏ꍇ�̓N���X���̌ゾ�����̂ɑ΂��A���\�b�h�ł̓��\�b�h���̑O�ɂȂ�܂��B

���̗�� java.util.Collections �N���X�� fill ���\�b�h�̒�`�ł��B

    public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal);

T ���p�����[�^�ƂȂ�^�ł��B���\�b�h�̒��ł� T �͕��ʂ̌^�̂悤�Ɏg����̂̓N���X�̂Ƃ��Ɠ��l�ł��B

java.util.Collections �N���X�� java.util.Arrays �N���X�̂悤�� static ���\�b�h�΂���̃N���X�̓C���X�^�������Ȃ��̂ŁA���̂悤�Ƀ��\�b�h���p�����[�^�����邱�Ƃ������悤�ł��B

��قǂƓ��l�Ƀ��C���h�J�[�h��p���邱�Ƃ��ł��܂��B���̗�͓����� Collections �N���X�� copy ���\�b�h�ł��B

    public static <T>void copy(List<? super T> dest, List<? extends T> src);

T �̔h���N���X�� T �̃X�[�p�N���X�ɂ̓R�s�[�ł���Ƃ������Ƃł��B

�P�Ȃ郏�C���h�J�[�h���g���܂��B���̏ꍇ�͂ǂ�ȃN���X�ł������̂ŁA�߂�l�̑O�̃p�����[�^�\�L�͕K�v����܂���B

���C���h�J�[�h�̗�Ƃ��� Collections �N���X�� reverse ���\�b�h�ł��B���X�g�̕��я���ς��邾���Ȃ̂ŁAList �̗v�f�͂ǂ�ȃN���X�̃I�u�W�F�N�g�ł������킯�ł��B

    public static void reverse(List<?> list);

���\�b�h�������p�����[�^�����邱�Ƃ͂��܂�Ȃ���������܂��񂪁Astatic ���\�b�h�����̃��[�e�B���e�B�N���X�Ȃǂŏd�󂵂����ł��B

�@
�@
Tiger �ǂ�ǂ�g���� ���\�b�h��
�@
�@

���܂ŗ�ɂ��� Generics �̎g�����͂��ׂăN���X/�C���^�t�F�[�X�ɑ΂��� Generics �ł����B�Ƃ����̂����\�b�h�̕��͒�`�̎d����������Ă���o�Ȃ��ƁA�g������������ɂ����Ǝv��������ł��B

�O�͂Ńp�����[�^���������\�b�h�̏��������������̂ŁA���������g���Ă݂܂��傤�B

�p�����[�^������Ă��郁�\�b�h���R�[������ꍇ�̓��\�b�h���̑O�� <�N���X�� or �C���^�t�F�[�X��> �������悤�ɂ��܂��B�N���X�̏ꍇ�͌�낾�����̂ł����A���\�b�h�͋t�ɑO�ł��B

�܂��́A��قǂ� Collections#replaceAll ���\�b�h���g���Ă݂܂��傤�B

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
 
public class GenericsMethodSample1 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(new Integer(i));
        }
 
        Collections.<Integer>replaceAll(list, new Integer(0),
                                              new Integer(10));
 
        for (int i = 0; i < 10; i++) {
            System.out.println(list.get(i));
        }
    }
}

�Ԃ̕������p�����[�^���������\�b�h�ł��B���\�b�h���̑O�� <Integer> ���‚��邾���Ō�͕��ʂ̃��\�b�h�Ɠ��l�ɃR�[�����邱�Ƃ��ł��܂��B

Collections#copy ���g���Č��܂��傤�B

import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
 
public class GenericsMethodSample2 {
    public static void main(String[] args) {
        List<Serializable> slist = new ArrayList<Serializable>();
        slist.add(null);
        List<C> clist = new ArrayList<C>();
        clist.add(new C());
 
        Collections.<B>copy(slist, clist);
 
        for (int i = 0; i < slist.size(); i++) {
            System.out.println(slist.get(i));
        }
    }
}

class A implements Serializable {}
class B extends A {}
class C extends B {}

�N���X�̎��͒P�ɃX�[�p�N���X���g���Ă݂��̂ŁA�����ł̓C���^�t�F�[�X���g���Ă݂܂������A���Ȃ��g���Ă��܂��B

�Ō�� Collections#reverse �ł��B�P�Ƀ��C���h�J�[�h���g�p�������\�b�h�̓p�����[�^�̕\�L���s���Ă��܂���ł����B�g���Ƃ������l�ŁA�܂��������ʂ̃��\�b�h�Ɠ����悤�Ɏg�����Ƃ��ł��܂��B

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
 
public class GenericsMethodSample3 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            list.add(new Integer(i));
        }
 
        Collections.reverse(list);
 
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

 

�@
�@
Tiger ���܂�C�ɂ��Ă����傤���Ȃ��񂾂���...
�@
�@

�v���O����������ł͂��܂�֌W�Ȃ���������܂��񂪁AGenerics �𓱓����邱�Ƃɂ���Ă����‚�����d�l��N���X�t�@�C���̍\�����ύX����Ă��܂��B

 

�V�t�g���Z�q�� Generics

Generics ������q�ɂȂ��Ă����

    List<List<String>>

�Ȃ�Ăӂ��� >> �Ƃ����̂��o�Ă��邱�Ƃ�����܂��B�ł��A�悭�l�����炱��̓V�t�g���Z�q�ł��ˁB3 �d�ɓ���q�ɂ����� >>> �ƂȂ��Ă��܂��܂��B������V�t�g���Z�q�ł��B

Generics ���������ꂽ���ߌ���d�l���ύX����āA>> �� >>> �Ƃ������V�t�g���Z�q�� Generics ����ʂ����悤�ɂȂ�܂����B

 

�߂�l�����Ⴄ���\�b�h�̃I�[�o���C�h

���܂ł͖߂�l�����Ⴄ���\�b�h��h���N���X���I�[�o���C�h���邱�Ƃ͂ł��܂���ł����B

���Ƃ��΁A�‚��̂悤�ȃv���O�����͂ǂ��ł��傤�B

public class ReturnTypeTest1 {
    public static void main(String[] args) {
        X x = new X();
        Y y = new Y();
 
        System.out.println(x.foo(10));
        System.out.println(y.foo(10));
    }
}
 
class X {
    public Number foo(int x) {
        return new Integer(x);
    }
}
 
class Y extends X {
    public Integer foo(int x) {
        return new Integer(x);
    }
}

Y �N���X�ł� foo ���\�b�h�̖߂�l�� X �N���X�̂���ƈقȂ� Integer �N���X�ɂȂ��Ă��܂��B������]���� javac �ŃR���p�C������ƁA

C:\JSR014\examples>C:\j2sdk1.4.2\bin\javac ReturnTypeTest1.java
ReturnTypeTest1.java:18: Y �� foo(int) �� X �� foo(int) ���I�[�o�[���C�h�ł��܂�
��B�݊����̂Ȃ��߂�l�̌^���g�����Ƃ��܂����B
���o�l  : java.lang.String
���Ғl  : java.lang.Integer
    public String foo(int x) {
                  ^
�G���[ 1 ��
C:\JSR014\examples>

���R�̂��Ƃ��G���[���o�܂��B�Ƃ��낪 Generics �𓱓����邱�ƂŁA�X�[�p�N���X�̃��\�b�h�̖߂�l�̃N���X�̔h���N���X�ł���΁A�h���N���X�Ń��\�b�h���I�[�o���C�h���Ă����悤�ɂȂ�܂����B

��قǂ̗Ⴞ�ƁAInteger �N���X�� Number �N���X�̔h���N���X�Ȃ̂ŁA�R���p�C���ł��邱�ƂɂȂ�܂��B

 

�@
�@
Tiger ���ۂ͂ǂ��Ȃ��Ă� ????
�@
�@

J2SDK ���ƕ�����Ȃ��Ȃ��Ă��܂��܂����AEarly Access �ł��� java �� javac �� Windows �Ȃ�o�b�`�t�@�C���AUNIX ���ƃV�F���X�N���v�g�Ŏ�������Ă��܂����B ���Ƃ��� javac.bat �� java.bat �����Ă݂�ƁAjavac �̕��͂��낢��ƕύX���������Ă��܂��B�������Ajava �̕��� JAR �t�@�C���� 1 �’lj�����Ă��邾���ł��B

Windows �ł� java.bat �Ŏ��ۂ� Java �𓮍삳���镔���͎��̂悤�ɂȂ��Ă��܂��B

%J2SE14%\bin\java -Xbootclasspath/p:%JSR14DISTR%\gjc-rt.jar %*

-Xbootclasspath/p: �Ƃ����̂̓R�A�̃��C�u������ǂݍ��ޑO�ɂ����Ŏw�肵�Ă��� JAR �t�@�C����ǂݍ��܂��邽�߂̃I�v�V�����ł��B

�悤����� gjc-rt.jar �Ƃ��� JAR �t�@�C����ǂݍ���ł��邾���ŁAJVM �͑S�R�ύX����Ă��Ȃ��̂ł��B

�Ƃ������Ƃ� javac �����őS���s���Ă���???

���ꂶ��A��͂��Ă݂܂��傤�B���������Ƃ��ɖ𗧂‚̂��t�R���p�C���B����� Jad ���g���Ă݂܂����B

���̗�� Jad �ŋt�R���p�C�������Č��܂����B

import java.util.ArrayList;
import java.util.List;
 
public class CastTest3 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
 
        list.add("abc");
  
        String str = list.get(0);
    }
}

Jad �̌��ʂ̓f�t�H���g�ł͊g���q�� jad �ƂȂ�܂��B�t�R���p�C���̌��ʂł��B

import java.util.ArrayList;
import java.util.List;
 
public class CastTest3
{
 
    public CastTest3()
    {
    }
 
    public static void main(String args[])
    {
        ArrayList arraylist = new ArrayList();
        arraylist.add("abc");
        String s = (String)arraylist.get(0);
    }
}

���ʂ̏������ɖ߂��Ă��܂� !!

�v����ɁAjavac �ŃR���p�C������Ƃ��A�^�`�F�b�N���s���悤�ɂ��āAGenerics �̕����͈ȑO�̏������ɖ߂��Ă���Ă��邾���̂悤�ł��B�������Ǝv���܂���B

���̉�͂� Early Access �łōs���܂������AJ2SDK �ł��������ʂɂȂ�܂����BJVM ���ύX����Ă��Ȃ��̂͂������Ȃ悤�ł��B

�������A�N���X�t�@�C���̍\���͕ω����Ă��܂��B�N���X�⃁�\�b�h�̒�`�����ɂ̓A�g���r���[�g�Ƃ����̈悪����̂ł����A������ Generics �̏�񂪋L�������悤�ɂȂ��Ă��܂��B

 

�@
�@
Tiger �R�A���C�u�����͂ǂ����ς�����̂� ????
�@
�@

Tiger �ł̓R�A���C�u������ Generics ���g���ď���������Ă��܂��B

�ǂ�������������Ă���̂ł��傤���B�������ׂĂ݂܂��傤�B

���ׂ�̂ɕK�v�Ȃ̂� J2SDK, SE 1.5 �ɕt�����Ă���\�[�X�ł��B

�\�[�X���� Generics ���g�p���Ă�����̂𔲂��o���̂͑�ςł��B�����ŁAEarly Access �łɕt������\�[�X����ύX����Ă�����̂�T���o���A���ꂪ J2SDK �łǂ��Ȃ��Ă��邩���ׂĂ݂܂����B

�ύX����Ă���p�b�P�[�W�͎��̒ʂ�ł��B

  • java.lang
  • java.lang.ref
  • java.lang.reflect
  • java.util
  • java.util.jar
  • java.util.loggin

���ɕύX�̑傫�� java.lang, java.lang.reflect, java.util �ɂ‚��Ē��ׂĂ݂܂��傤�B

�܂� java.lang �p�b�P�[�W����ł��B

 

java.lang.lang �p�b�P�[�W�Ajava.lang.reflect �p�b�P�[�W

���� 2 �‚̃p�b�P�[�W�̕ύX�̓��t���N�V�����Ɋւ��镔���̕ύX�ł��B

�܂� Class �N���X�ł��B

Clas �N���X�̓p�����^�[�������悤�ɂȂ�܂����B���������āA���̂悤�ȏ��������ł��܂��B�������AObject#getClass ���\�b�h�̖߂�l�� Class<? extends Object> �ƂȂ��Ă���̂ŃL���X�g���K�v�ł��B

    String str = "ABC";
    Class<String> cls = (Class<String>)str.getClass();
    String str2 = cls.newInstance();

newInstance ���\�b�h�̖߂�l�������I�Ƀp�����[�^�����ꂽ�N���X�ɂȂ�̂ŃL���X�g���K�v�Ȃ��Ȃ�܂��B

���l�� getConstructor ���\�b�h���߂�l�� Constructor<T> �ɂȂ�܂��B

���̌��ʁAConstructor �N���X���p�����[�^������Ă��܂��B��͂�AnewInstance ���\�b�h�̖߂�l���p�����[�^�̃N���X�ɂȂ�̂ŁA�L���X�g���v��Ȃ��Ȃ�܂��B

 

java.util �p�b�P�[�W

��ԁA�ύX���傫���̂� java.util �p�b�P�[�W�̃R���N�V�����֘A�̃N���X�ł��B

��{�I�ɁACollection �C���^�t�F�[�X�̔h���N���X�AMap �C���^�t�F�[�X�̔h���N���X�͂��ׂăp�����[�^������Ă��܂��BCollection �C���^�t�F�[�X��

public interface Collection<E> extends Iterable<E> {
	  ...

Map �C���^�t�F�[�X��

public interface Map<K,V> {
	  ...

�ƂȂ��Ă��܂��BIterable �C���^�t�F�[�X�Ƃ����̂͐V�����������ꂽ�C���^�t�F�[�X�ŁA�g�� for ���Ŏg�p����܂��B

�܂��AIterator �C���^�t�F�[�X���p�����[�^������Ă��܂��B

Collections �N���X�� Array �N���X�̓p�����[�^������Ă͂��܂��񂪁A������ static ���\�b�h���p�����[�^������Ă��܂��B

 

�@
�@
Tiger ������
�@
�@

Generics �g�������ƁA���܂ł̋�J�͂Ȃ񂾂����񂾂Ƃ����ӂ��ɂȂ�܂��B�y���J���`���[�V���b�N��Ԃł� ^^;;

�Ƃ��낪�A�g���o���Ƃ�����߂��܂���B���܂ł̐����ɂ͖߂�Ȃ��̂ɂȂ��Ă��܂��܂����B

���܂ɁAJ2SE 1.4 �Ƃ��ŏ����Ƃ��ɁA�v�킸 Generics �ŏ����Ă��āA�u����͂����Ȃ��A���ǂ��Ȃ��Ắv�Ƃ������Ƃ����΂��΁B

����� C++ �̃e���v���[�g�Ƃ̔�r�Ȃ��͍s���܂���ł������A�Q�l�����������܂����̂ŁA����������Q�Ƃ��������BJavaWorld �̋L���͂��Ȃ�Â��̂Ō���� Generics �Ƃ͐H������Ă��镔��������܂��B

�Ȃɂ͂Ƃ�����AGenerics �͕֗��Ȃ̂ŁA���Ђ����p���B

 

����g�p�����T���v���͂�������_�E�����[�h�ł��܂��B

�Q�l

  • JCP JSR-14 http://jcp.org/en/jsr/detail?id=14
    �d�l���͂�������_�E�����[�h�ł��܂�
  • ���猒�� �uJava Generics �t�@�[�X�g�E���r���[�v JavaWorld, 2002 January, p.76 - p.97
    Part 2 �� Generics �� C++ �̃e���v���[�g�̔�r���s���Ă��܂��B
  • �ēc�F�� �uJava Generics �\���͂ƈ��S�������コ���� "Tiger" �̐V�@�\�v JAVA PRESS Vol. 28 p. 12 -21
    JAVA PRESS Vol.30 �̕t�� CD �ɂ������Ă��܂��B

(Oct. 2003)
(���� Jan. 2004)

�@
�@
Go to Contents Go to Java Page
�@