Java汎用学習四:汎用その他の知識点
5375 ワード
一.冒頭
汎用型を学ぶ過程で、こまごました知識点がたくさんあって、それらは単独の文章で言うのがよくなくて、ついにこのように羅列しました.
二.汎用例外 catch文は、コンパイラと実行中に例外の正確なタイプを知る必要があるため、汎用タイプの例外をキャプチャできません. 汎用クラスは、Throwableを直接または間接的に継承することはできません.これは、汎用形式タイプパラメータがThrowableを継承できないというわけではありません.
三.汎用配列配列はコヒーレントであり、Super[]はSub[]の親タイプである. 汎用型は可変なinvariantであり、ListはListとは何の関係もない. 以上の2点は、汎用配列の作成、パラメトリックタイプの配列、タイプパラメータの配列が不正であるなど、配列と汎用がうまく混用できないことを決定しています.詳細については、リファレンスコードを参照してください. ですが、汎用配列を作成するには独自の方法があります.3つの方法はThinking in Java P 384-386を参照してください.サードパーティ方式は以下のように少し修正されています.
四.汎用リロード
同じメソッド署名が生成され、コンパイルは通過しません.
五.じこせいげんいじょう SelfBoundedクラスは形式タイプパラメータTを受け入れるが、Tには形式タイプパラメータとしてTを持つSelfBoundedである境界クラスが限定される. 奇妙な循環汎用(CRG)の本質:ベースクラスはその実際のタイプパラメータとして導出クラスを用いる.
汎用型を学ぶ過程で、こまごました知識点がたくさんあって、それらは単独の文章で言うのがよくなくて、ついにこのように羅列しました.
二.汎用例外
package com.jyz.study.jdk.generic;
/**
*
* @author [email protected]
*
*/
public class GenericException<T extends Throwable> {
void test(T t) throws T{//T Throwable,
try{
throw t; //T Throwable,
}catch(T ex){ //compile error 1.catch
// , T Throwable
}
}
void erasureTest(Throwable t) throws Throwable {
try{
throw t;
}catch(Throwable ex){
}
}
}
//compile error
//2. Throwable
// Throwable
class MyException<T extends Throwable> extends Throwable{
}
三.汎用配列
package com.jyz.study.jdk.generic;
import java.util.ArrayList;
/**
* covarant, Super[] Sub[]
* invariant, List<Super> List<Sub>
* @author [email protected]
*
*/
public class ArrayAndList<T> {
void test1(){
Number[] objectArray = new Long[1];
objectArray[0] = 10.10;// java.lang.ArrayStoreException: java.lang.Double
}
void test2(T t){
// List<Number> list = new ArrayList<Long>();//comiple error
}
//
// , ,
void illegal(Object object){
//
List<String>[] justAReference;
// //but ,
// justAReference = new ArrayList<String>()[];
// new ArrayList<T>()[];
// new T[10];
// //
// obj instanceof T
// new T();
}
public static void main(String[] args) {
System.out.println(new ArrayList<Number>().getClass());
System.out.println(new ArrayList<Integer>().getClass());
}
}
package com.jyz.component.core.collection;
import java.lang.reflect.Array;
import java.util.Arrays;
/**
*
* from Thinking in Java page 385
* @author [email protected]
*
*/
public class JyzArray<T> {
private T[] array;
/**
*
* @param clazz ,
* T[], Object
* @param length
*/
@SuppressWarnings("unchecked")
public JyzArray(Class<T> clazz, int length){
array = (T[]) Array.newInstance(clazz, length);
}
/**
* put item to index
* @param index
* @param item
* @throws IndexOutOfBoundsException
*/
public void put(int index, T item){
RangeCheck(index, array.length);
array[index] = item;
}
/**
*
* @param index
* @return
* @throws IndexOutOfBoundsException
*/
public T get(int index){
RangeCheck(index, array.length);
return array[index];
}
/**
*
* @return
*/
public T[] rep(){
return array;
}
private void RangeCheck(int index, int length) {
if (index >= length) {
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+length);
}
}
public static void main(String[] args) {
JyzArray<Integer> jyzArray = new JyzArray<Integer>(Integer.class, 8);
for(int i=0; i<8; i++){
jyzArray.put(i, i);
}
Integer[] array = jyzArray.rep();
System.out.println(Arrays.toString(array));
}
}
四.汎用リロード
void f(List<T> v){}
void f(List<TT> v){}
同じメソッド署名が生成され、コンパイルは通過しません.
五.じこせいげんいじょう
public class SelfBounded<T extends SelfBounded<T>> {
}
//
class GenericType<T>{}
class CuriouslyRecurringGeneric extends GenericType<CuriouslyRecurringGeneric>{}