Class T ?Object

? 表示不確定的java類型。

T 表示java類型。

K V 分別代表java鍵值中的Key Value。

E 代表Element。

Object跟這些東西代表的java類型有啥區別呢? 
Object是所有類的根類,是具體的一個類,使用的時候可能是需要類型強制轉換的,但是用T ?等這些的話,在實際用之前類型就已經確定了,不需要強制轉換。

第一種是固定的一種泛型,第二種是隻要是Object類的子類都可以,換言之,任何類都可以,因爲Object是所有類的根基類
固定的泛型指類型是固定的,比如:Interge,String. 就是<T extends Collection>

<? extends Collection> 這裏?代表一個未知的類型,
但是,這個未知的類型實際上是Collection的一個子類,Collection是這個通配符的上限.
舉個例子
class Test <T extends Collection> { }

<T extends Collection>其中,限定了構造此類實例的時候T是一個確定類型(具體類型),這個類型實現了Collection接口,
但是實現 Collection接口的類很多很多,如果針對每一種都要寫出具體的子類類型,那也太麻煩了,乾脆還不如用
Object通用一下。
<? extends Collection>其中,?是一個未知類型,是一個通配符泛型,這個類型是實現Collection接口即可。

1
2
3
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Dog>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Cat>)
The method take(Animal) in the type Test is not applicable for the arguments (Demo<Animal>)


1
2
3
4
5
6
7
8
public class Demo <T extends Animal>{    private T ob;    public T getOb() {        return ob;
    }    public void setOb(T ob) {        this.ob = ob;
    }    public Demo(T ob) {        super();        this.ob = ob;
    }   
    public void print(){
        System.out.println("T的類型是:"+ob.getClass().getName());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public <T> Class<T> resolveAlias(String string) {   
   try {     
      if (string == null) {       
      return null;
     }     
     // issue #748
     String key = string.toLowerCase(Locale.ENGLISH);
     Class<T> value;     
     if (TYPE_ALIASES.containsKey(key)) {       
     value = (Class<T>) TYPE_ALIASES.get(key);
     else {       
     value = (Class<T>) Resources.classForName(string);
     }     
     return value;
   catch (ClassNotFoundException e) {     
   throw new TypeException("Could not resolve type alias '" + string + "'.  Cause: " + e, e);
   }
 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Base {   
private static Map<String, Class<?>> map = new HashMap<>();   
static {       
map.put("string", String.class);       
map.put("integer", Integer.class);
    }
    @SuppressWarnings("unchecked")   
    public <T> Class<T> get(String str) {       
    return (Class<T>) map.get(str);
    }
    @Test   
    public void t() throws IllegalAccessException, InstantiationException {
        Base base = new Base();
        Class<Integer> string = base.get("string");
        System.out.println(string);
    }
}

Class類的實例表示Java應用運行時的類(class ans enum)或接口(interface and annotation)(每個java類運行時都在JVM裏表現爲一個Class對象,可通過類名.class,類型.getClass(),Class.forName("類名")等方法獲取Class對象)。數組同樣也被映射爲爲Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。基本類型boolean,byte,char,short,int,long,float,double和關鍵字void同樣表現爲 Class  對象。

T  bean ;

Class<T> bean;

Class<?> bean;

在利用反射獲取屬性時,遇到這樣的寫法,對此專門查些資料研究了一下。

單獨的T 代表一個類型 而 Class<T>和Class<?>代表這個類型所對應的類

Class<T>在實例化的時候,T要替換成具體類 Class<?>它是個通配泛型,?可以代表任何類型   

<? extends T>受限統配,表示T的一個未知子類。 <? super T>下限統配,表示T的一個未知父類。

public T find(Class<T> clazz, int id);
根據類來反射生成一個實例,而單獨用T沒法做到。

Object類中包含一個方法名叫getClass,利用這個方法就可以獲得一個實例的類型類。類型類指的是代表一個類型的類,因爲一切皆是對象,類型也不例外,在Java使用類型類來表示一個類型。所有的類型類都是Class類的實例。getClass() 會看到返回Class<?>。

JDK中,普通的Class.newInstance()方法的定義返回Object,要將該返回類型強制轉換爲另一種類型;

但是使用泛型的Class<T>,Class.newInstance()方法具有一個特定的返回類型;

參照:http://josh-persistence.iteye.com/blog/2235725
           https://blog.csdn.net/J_Cxn/article/details/78581943?locationNum=8&fps=1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章