java泛型向下限定_泛型类型限定和通配符类型限定

泛型类型变量的限定

泛型的基础知识可以参考其他教程。

如果在方法前指定了,那么就是说,方法的这个泛型类型和类定义时的泛型类型无关,这个特性让泛型方法可以定义在普通类中而不是泛型类中。

我们都知道,泛型中可以限定类型变量必须实现某几个接口或者继承某个类,多个限定类型用&分隔,类必须放在限定列表中所有接口的前面。例如:

import java.io.Serializable;

/**

* ICE

* 2016/10/17 0017 14:12

*/

public class Demo {

public static void main(String[] args) {

D d = new D<>();

A a = new A();

d.test1(a);

B b = new B();

d.test1(b);

C c = new C();

d.test1(c);

d.test2("test");

}

}

class A implements Serializable, Cloneable {

@Override

public String toString() {

return "A{}";

}

}

class B extends A {

@Override

public String toString() {

return "B{}";

}

}

class C extends A {

@Override

public String toString() {

return "C{}";

}

}

class D {

public void test1(T t) {

System.out.println(t);

}

public  void test2(T t) {

System.out.println(t);

}

}

输出:

A{}

B{}

C{}

test

通配符类型

通配符“?”同样可以对类型进行限定。可以分为子类型限定、超类型限定和无限定。通配符不是类型变量,因此不能在代码中使用"?"作为一种类型。

子类型限定

表示类型的上界,类似泛型的类型变量限定,格式是:? extends X。

特点:

1、限定为X和X的子类型,但不知道具体是哪个子类型,可能是怕导致类型转换错误(比如向下转型时编译不会报错,但是如果超类引用不是指向子类对象,那么运行时会报错),所以作为方法的参数时,这里禁止传递特定的类型。

2、作为方法的参数时,可以传递null。

作用:主要用来安全地访问数据,可以访问X及其子类型。

import java.util.ArrayList;

import java.util.List;

/**

* ICE

* 2016/10/17 0017 14:12

*/

public class Demo {

public static void main(String[] args) {

A a = new A();

B b = new B();

C c = new C();

List list = new ArrayList<>();

list.add(a);

list.add(b);

list.add(c);

//根据list的值,我们可以给列表中的对象做 extends A>限定,因为都是A和A的子类,get返回值赋给A是完全合法的

List extends A> list1 = list;

list.add(null);

for (int i = 0; i 

A a1 = list1.get(i);

System.out.println(a1);

}

//这里如果set任何非null的值,编译器都会报错

D extends A> d = new D<>();

d.set(null);

}

}

class A {

@Override

public String toString() {

return "A{}";

}

}

class B extends A {

@Override

public String toString() {

return "B{}";

}

}

class C extends A {

@Override

public String toString() {

return "C{}";

}

}

class D {

public void test1(T t) {

System.out.println(t);

}

public void set(T t) {

}

}

输出:

A{}

B{}

C{}

null

超类型限定

表示类型的下界,格式是:? super X。

特点:

1、限定为X和X的超类型,直至Object类,因为不知道具体是哪个超类型,因此方法返回的类型只能赋给Object。

2、因为可以向上转型,所以作为方法的参数时,可以传递X以及X的子类型。

3、作为方法的参数时,可以传递null。

作用:主要用来安全地写入数据,可以写入X及其子类型。

/**

* ICE

* 2016/10/17 0017 14:12

*/

public class Demo {

public static void main(String[] args) {

A a = new A();

B b = new B();

C c = new C();

D super A> d = new D<>();

Object o = d.get();

d.set(a);

d.set(b);

d.set(c);

d.set(null);

}

}

class A {

@Override

public String toString() {

return "A{}";

}

}

class B extends A {

@Override

public String toString() {

return "B{}";

}

}

class C extends A {

@Override

public String toString() {

return "C{}";

}

}

class D {

public void set(T t) {

}

public T get() {

return null;

}

}

无限定

无限定不等于可以传任何值,相反,作为方法的参数时,只能传递null,作为方法的返回时,只能赋给Object。

/**

* ICE

* 2016/10/17 0017 14:12

*/

public class Demo {

public static void main(String[] args) {

D> d = new D<>();

Object o = d.get();

d.set(null);

}

}

class A {

@Override

public String toString() {

return "A{}";

}

}

class B extends A {

@Override

public String toString() {

return "B{}";

}

}

class C extends A {

@Override

public String toString() {

return "C{}";

}

}

class D {

public void set(T t) {

}

public T get() {

return null;

}

}

有什么作用呢?对于一些简单的操作比如不需要实际类型的方法,就显得比泛型方法简洁。

/**

* ICE

* 2016/10/17 0017 14:12

*/

public class Demo {

public static void test(D> d) {

System.out.println(d == null);

}

public static  void test1(D d) {

System.out.println(d == null);

}

public static void main(String[] args) {

D d = new D();

Demo.test(d);

Demo.test1(d);

}

}

class D {

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 中的限定通配符是指在类型中使用了extends或super关键字来限制类型的范围,使其只能接受某个特定类型或其子类型或父类型作为参数。例如:List<? extends Number>表示只能接受Number及其子类作为参数。 非限定通配符是指在类型中使用了通配符“?”来表示可以接受任何类型作为参数,但是在使用时无法获取类型的具体信息。例如:List<?>表示可以接受任何类型的List作为参数,但是无法获取其中元素的具体类型信息。 ### 回答2: Java语言中一种非常强大的特性,它能够使Java代码更加通用和安全。 在中,通配符是一种非常重要的语法,它能够限制类型范围,从而使Java程序更加类型安全。通配符分为限定通配符和非限定通配符两种类型。 首先,非限定通配符就是指没有任何限制的通配符,使用“?”符号来表示。在Java中,我们可以将一个对象赋值给一个非限定通配符对象,这样就可以保证代码的通用性。 举个例子,假设我们有一个ArrayList集合,集合中存储的是Animal类的对象。我们可以将这个ArrayList赋值给一个非限定通配符的对象,这样就可以将集合中的元素通用化,可以同时适用于Cat类和Dog类。 但是,如果我们想要对通配符进行类型限制,就需要使用限定通配符了。 限定通配符可以通过使用extends或者super关键字来实现。其中,extends用于限制类型的上界,super用于限制类型的下界。 需要注意的是,extends和super关键字只能使用在通配符中,而不能直接用在中。 举个例子,假如我们有一个Animal类,以及它的两个子类Cat和Dog。我们现在想要一个可以存储Animal及其子类对象的集合,但是不想让集合存储Bird及其子类对象。这个时候,我们就可以使用限定通配符来约束集合元素的类型范围。例如: ArrayList<? extends Animal> animals = new ArrayList<Cat>(); //这是合法的 ArrayList<? extends Animal> animals2 = new ArrayList<Bird>(); //这是不合法的 这样就能够保证animals集合只存储Animal及其子类对象,而不会存储Bird及其子类对象。 总之,限定通配符和非限定通配符中的两个重要概念。通过使用这些通配符,我们可以限制类型的范围,使Java程序更加类型安全。 ### 回答3: 中的通配符指的是在定义类或方法时使用的一种特殊符号,它可以替代任何类型的实参,从而实现更加灵活的代码编写。 其中,有两种常见的通配符,分别是限定通配符和非限定通配符。 非限定通配符用“?”表示,它可以匹配任何类型的实参。例如,定义一个方法时可以使用“?”作为参数类型,这样就能够在方法中处理任何类型的数据。 限定通配符则使用类型来表示,它可以限制通配符只能匹配某些具体的类型或其子类型。例如,定义方法时可以使用“? extends Number”来限定参数类型范围,这样方法只接受Number及其子类类型的实参。 在使用通配符时,需要注意通配符只能作为参数、返回值或类型变量的上界使用,不能用作实例化类型类型参数的下界。此外,通配符不能使用任何操作符,而只能使用Object类提供的通用方法。 综上所述,中的限定通配符和非限定通配符是为了提高程序的灵活性和适用性而设计的。通过选择适当的通配符来限制参数类型范围,可以有效避免类型转换异常和其他类型相关的问题,使代码更加健壮和可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值