java genericity_JAVA 泛型中的extends和super

1.List extend Fruit> list=new ArrayList<>(); 解釋為:集合中元素是繼承自Fruit,究竟是何種類型,編譯器也無法判定。

如果要從集合中讀取類型T的數據,並且不能寫入,可以使用 ? extends 通配符;(Producer Extends)

2.List super Apple> list=new ArrayList<>();解釋為:集合中的元素是Apple的父類,無法判定具體類型。

如果要從集合中寫入類型T的數據,並且不需要讀取,可以使用 ? super 通配符;(Consumer Super)

如果既要存又要取,那么就不要使用任何通配符。

3.>和>

example:package genericity;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Collections;

import java.util.List;

/**

* TypeParameterTest

* 對比>和>

* Created by heqianqian on 2017/6/1.

*/

public class TypeParameterTest {

public static > void mySort1(List list) {

Collections.sort(list);

}

public static > void mySort2(List list) {

Collections.sort(list);

}

public static void main(String[] args) {

List animals = new ArrayList<>();

animals.add(new Animal(1));

animals.add(new Dog(35));

List dogs = new ArrayList<>();

dogs.add(new Dog(100));

dogs.add(new Dog(120));

mySort1(animals);

//mySort1(dogs);

}

}

class Animal implements Comparable {

protected int age;

public Animal(int age) {

this.age = age;

}

@Override

public int compareTo(Animal o) {

return this.age - o.age;

}

}

class Dog extends Animal {

public Dog(int age) {

super(age);

}

}

其中mySort1(dogs) 會編譯報錯Error:(33, 9) java: 無法將類 genericity.TypeParameterTest中的方法 mySort1應用到給定類型;

需要: java.util.List

找到: java.util.List

原因: 推斷類型不符合等式約束條件

推斷: genericity.Animal

等式約束條件: genericity.Animal,genericity.Dog

>類型 T 必須實現 Comparable 接口,並且這個接口的類型是 T。只有這樣,T 的實例之間才能相互比較大小。例如,在實際調用時若使用的具體類是 Dog,那么 Dog 必須 implements Comparable

>類型 T 必須實現 Comparable 接口,並且這個接口的類型是 T 或 T 的任一父類。這樣聲明后,T 的實例之間,T 的實例和它的父類的實例之間,可以相互比較大小。例如,在實際調用時若使用的具體類是 Dog (假設 Dog 有一個父類 Animal),Dog 可以從 Animal 那里繼承 Comparable ,或者自己 implements Comparable 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值