Chr*_*ski 1 java generics declaration
我无法掌握整个泛型声明,即使在阅读了关于Java的书籍中的无数文章和条目之后,它们似乎都没有以简单明了的方式解释它.请任何人解释我的那些?:
class Something<T> {...}
Run Code Online (Sandbox Code Playgroud)
我知道T是什么,并且我理解当我们想要为我们传入的任何类型的Object类型编写通用定义/方法时,我们使用泛型,而是具有特定于一种类型的Object扩展的不同类型的方法,我们写一个可以包括一种或多种类型的通用的(因此大写字母T).但是最让我烦恼的是下一个声明示例:
public <T extends Comparable<T>> void Something{...}
Run Code Online (Sandbox Code Playgroud)
首先; 可比较是一个接口而不是一个类(如果我错了,请纠正我)所以第一个为什么它extends不是implements.现在,为什么它必须被宣布(这整个<T ...>之前的东西)void现在和现在Comparable<T>?那是什么意思?进入的Object类型必须具有implements Comparable<T>?因此,如果我想作为类型参数传递类class Something{...}我将得到一个错误,但传递class Something implements Comparable<T>{...}会没事?请揭开我的神秘面纱:(明天我有一个考试,我不能抓住其他东西而不抓住这一个...... :(
首先在Java中你有两件事:
class GenericContainer<T>public <T> method()第一个用于定义通用的类,而后者用于定义在类型上通用的方法.虽然两者都使用相同的原则,但它们是两回事.
您必须明确声明方法是通用的,例如
public <T extends Comparable<T>> void myGenericMethod(...)
Run Code Online (Sandbox Code Playgroud)
就是你在Java中声明泛型方法的方式.这只是语法.如果要声明泛型方法,则必须在方法签名之前使用该语法指定类型参数.
关于你关于T extends Comparable<T>思考这个事实的问题:当使用泛型变量时T myVariable,你必须将这个变量用于某种目的.由于Java是一种强类型语言,因此T必须以编译类型来确定您能够了解的所有内容.
在您的示例中,假设您现在希望能够对两个对象进行排序
public <T> void method(T v1, T v2)
Run Code Online (Sandbox Code Playgroud)
会工作,但你将无法调用任何东西,v1或者v2你不会被允许,因为T它只是一个没有约束的泛型类型.v1.compareTo(v2)导致编译错误.那么,你如何解决这个问题呢?
您对类型变量强制执行约束:
public <T extends Comparable<T>> void method(T v1, T v2)
Run Code Online (Sandbox Code Playgroud)
这样,您将被强制传递给method()必须实现的同一个类的实例,Comparable<T>否则您将收到编译时错误.但是您将获得允许调用的优势,compareTo(..)因为您可以保证传递给方法的对象能够响应它.