Generics
12014 ワード
ギネス世界記録
コンパイル時にタイプをチェックする機能:compile-time type check
オブジェクトのタイプ安定性を提供します.(防止クラスCastException)
タイプチェックと成形遷移を省略できるため、コードを簡略化します.
ランタイムエラー、ランタイムエラーをCompile-timerrorに変換する方法そこから作られたのはギネス世界記録です.ClassCastException(Runtime error)をGenericsにドラッグします.
// Tv 객체만 저장할 수 있는 ArrayList 생성
ArrayList<Tv> tvList = new ArrayList<Tv>(); // 타입변수 E 대신에, 실제 타입 Tv 대입
tvList.add(new Tv()); // ok
tvList.add(new Audio()); // 컴파일 에러. Tv 외 다른 타입 저장 불가
// 장점
ArrayList tvList = new ArrayList();
tvList.add(new Tv());
Tv t = (Tv) tvList.get(0); // Tv - Object 간 타입 불일치로, 형변환 필요
// ↓ 아래와 같이 간소화 가능
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
Tv t = tvList.get(0); // 형변환 불필요 : 반환타입이 Tv 이기 때문. (타입 일치)
タイプ変数
ムカデクラスを作成する場合は、オブジェクトタイプではなくタイプ変数(E)を使用します.
Objectを含むクラスのほとんどがGenericクラスに変更されました.
オブジェクトを作成する場合は、タイプ変数Eではなく実際のタイプを指定する必要があります(インポート)
タイプ変数ではなく実際のタイプを指定する場合は、シェイプ変換を省略できます.
ギネス世界記録用語
Box
T:タイプ変数またはタイプパラメータ.(Tはタイプ文字)
Box:オリジナルタイプ(オリジナルタイプ).通常レベル時のタイプ.元のタイプ
// 지네릭 클래스 선언
class Box<T> {}
// ↓ 지네릭 타입 호출 ↓ : 타입이 서로 일치해야 함.
Box<String> b = new Box<String>();
// ↑ 대입된 타입 (매개변수화 된 타입) : 생성할 때마다, 다른 타입을 넣을 수 있음.
ムカデ型の多形性
// ↓ 지네릭 타입 호출 ↓ : 타입이 서로 일치해야 함.
Box<조상> b = new Box<자손>(); // 이렇게는 안됨! 에러남!! 반드시 일치해야 됨.
List<Tv> list = new ArrayList<Tv>(); // OK. 다형성. ArrayList가 List 구현
List<Tv> list = new LinkedList<Tv>(); // OK. 다형성. LinkedList가 List 구현
class Product {}
class Tv extends Product {}
class Audio extends Product {}
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product());
list.add(new Tv()); // Product의 자손도 add 가능.!
list.add(new Audio());
// add method 상황 설명
boolean add (E e) {...}
->
boolean add(Product e) {...}
// ↑ 다형성에 의해, Product와 그 자손 객체가 오는 것이 가능하다.
// get method도 같다
E get(int index) {...}
->
Product get(int index) {...} // get의 반환 타입이 Product임.
Product p = list.get(0);
Tv t = (Tv) list.get(1); // Product를 반환하므로, Tv로 형변환 필수
Iterator<E>
public interface Iterator<E> {
boolean hasNext();
E next(); // 원래 iterator는 object를 반환해서, 형변환이 필요했음
void remove();
}
HashMap<K, V>
// key value
HashMap<String, Student> map = new HashMap<String, Student>();
map.put("자바왕", new Student("자바왕",1,1,100,100,100));
限られたギネス類
extendsを使用すると、代入可能なタイプを制限できます.
インタフェースの場合、extendsも使用する必要があります.
// 인터페이스도 타입 제한에서는 extends를 씁니다.
interface Eatable {}
class FruitBox<T extends Eatable> {}
class FruitBox<T extends Fruit> { // Fruit의 자손 type만 대입 가능
ArrayList<T> list = new ArrayList<T>();
...
}
FruitBox<Apple> appleBox = new FruitBox<Apple>(); // OK
FruitBx<Toy> toyBox = new FruitBox<Toy>(); // Error. Toy는 Fruit의 자손이 아님.
ギネス世界記録の制限
タイプ変数の代入は、インスタンスによって異なります.
Box
Box
タイプ変数はStaticメンバーには使用できません
Static:すべてのインスタンスが共通であるため、各インスタンスに対して設定できるタイプ変数は使用できません.
オブジェクトまたは配列を作成する場合、タイプ変数は使用できません.(new演算子の後のタイプは「OK」でなければなりません.Tは不確定なので使用できません!=new演算子の後ではTを使用できません!)
タイプ変数を使用してアレイを宣言できます.
class Box<T> {
static T item; // 에러
static int compare(T t1, T t2) { ... } // 에러
}
class Box<T> {
T[] itemArr; // OK. T 타입 배열을 위한 참조 변수
...
T[] toArray() {
T[] tmpArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가
}
}
ワイルドカード<?>
別のオブジェクトを参照できる代替タイプの参照変数
< ? extends T>:ワイルドカードの上限制限.Tと彼らの子孫だけがこれを主に使うことができる!
< ? extends T>:ワイルドカードの制限.Tとその祖先だけが
< ? > : 制限なし.すべてのタイプが可能です.と同じ
メソッドのパラメータはワイルドカードで使用できます
// 대입된 타입이 일치하지 않아도 ok
// 참조변수 하나로 대입된 타입이 여러개가 될 수 있도록 유연하게 만들어줌
ArrayList<? extends Product> list = new ArrayList<Tv>(); // ok
ArrayList<? extends Product> list = new ArrayList<Audio>(); // ok
ArrayList<Product> list = new ArrayList<Tv>(); // 에러. 대입된 타입 불일치
// ex
static Juice makeJuice(FruitBox<? extends Fruit> box) { ... }
// 둘다 가능
Juicer.makeJuice(new FruitBox<Fruit>()));
Juicer.makeJuice(new FruitBox<Apple>()));
ギネス世界記録
ギネスタイプを宣言する方法(タイプ変数はメソッドでのみ有効)
static < T > void sort(List< T > list, Comparator< ? super T > c)
クラスのタイプパラメータ
class FruitBox<T> {
...
static <T> void sort(List<T> list, Comparator<? super T> c) {
...
}
}
Reference
この問題について(Generics), 我々は、より多くの情報をここで見つけました https://velog.io/@kimsy8979/지네릭스Genericsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol