Java 泛型约束是 Java 编程语言中的一种机制,它允许在编译时对参数化类型进行检查。泛型约束可以帮助开发人员在使用泛型时避免出错,并且可以提高代码的可读性。
Java 泛型约束的主要目的是为了保证在使用泛型时,传递的参数是正确的。例如,如果一个方法声明了一个泛型参数 T,那么在调用这个方法时,传递的参数必须是 T 的子类。这样就能够保证传递的参数是正确的,而不会出错。
public class MyClass<T extends Number> { public void doSomething(T t) { // do something with t } }
上面代码中定义了一个 MyClass 类,它声明了一个泛型 T,并使用 extends 关键字将 T 的边界设定为 Number 类。这样就能够保证在调用 doSomething() 方法时传递的参数必须是 Number 的子类。
通配符类型由问号表示,如<?> 。
对于通用类型,通配符类型是对象类型用于原始类型。
我们可以将任何已知类型的泛型分配为通配符类型。
这里是示例代码:
// MyBag of String type MyBag<String> stringMyBag = new MyBag<String>("Hi"); // You can assign a MyBag<String> to MyBag<?> type MyBag<?> wildCardMyBag = stringMyBag;
通配符通配类型中的问号(例如,<?>)表示未知类型。
当您使用通配符声明参数化类型作为参数类型时,这意味着它不知道它的类型。
MyBag<?> unknownMyBag = new MyBag<String>("Hello");
我们表示通配符的上限
<? extends T>
这里,T是一种类型。<? extends T>表示任何类型为T或其子类是可接受的。
例如,上限可以是数字类型。
使用上限作为数字,我们可以将方法定义为
class MyBag<T> { private T ref; public MyBag(T ref) { this.ref = ref; } public T get() { return ref; } public void set(T a) { this.ref = a; } } public class Main { public static double sum(MyBag<? extends Number> n1, MyBag<? extends Number> n2) { Number num1 = n1.get(); Number num2 = n2.get(); double sum = num1.doubleValue() + num2.doubleValue(); return sum; } }
不管你为n1和n2传递什么,它们将始终与Number的赋值兼容,因为编译器确保传递给sum()方法的参数遵循其声明中指定的规则 <? extends Number>。
指定下限通配符与指定上限通配符相反。
使用下限通配符的语法是<? super T>,这意味着“任何是T的超类型”。
class MyBag<T> { private T ref; public MyBag(T ref) { this.ref = ref; } public T get() { return ref; } public void set(T a) { this.ref = a; } } public class Main { public static <T> void copy(MyBag<T> source, MyBag<? super T> dest) { T value = source.get(); dest.set(value); } }
Java面向对象设计 -Java注释默认值我们可以为注释中的元素定义默认值。我们不需要为带有默认值的注释元素提供值。默认值可以使用...
Java面向对象设计 -Java接口字段一个接口可以有三种类型的成员:常量字段抽象,静态和默认方法静态类型作为嵌套接口和类一个接口...
Java面向对象设计 - Java异常类异常类层次结构异常类层次结构从java.lang.Throwable类开始。当抛出异常时,它必须是Throwable类...
Java数据类型教程 -Java字符串比较String类覆盖了Object类的equals()方法,并提供了自己的实现,它根据它们的内容比较两个字符串...