Java 泛型定义
我无法理解整个泛型声明,即使在阅读了无数关于Java的文章和书籍中的条目之后,它们似乎都没有以简单明了的方式解释它。谁能给我解释一下吗Java 泛型定义,java,generics,declaration,Java,Generics,Declaration,我无法理解整个泛型声明,即使在阅读了无数关于Java的文章和书籍中的条目之后,它们似乎都没有以简单明了的方式解释它。谁能给我解释一下吗 class Something<T> {...} class某物{…} 我知道T是什么,我知道当我们想要为传入的任何类型的类型对象编写通用定义/方法时,我们使用泛型,而不是为一种类型的对象扩展编写不同类型的方法,我们编写一个泛型方法,可以包含一种或多种类型(因此大写T)。但最让我烦恼的是下一个声明示例: public <T extends
class Something<T> {...}
class某物{…}
我知道T是什么,我知道当我们想要为传入的任何类型的类型对象编写通用定义/方法时,我们使用泛型,而不是为一种类型的对象扩展编写不同类型的方法,我们编写一个泛型方法,可以包含一种或多种类型(因此大写T)。但最让我烦恼的是下一个声明示例:
public <T extends Comparable<T>> void Something{...}
public void Something{…}
首先;Comparable是一个接口而不是一个类(如果我错了,请纠正我),那么为什么它是扩展的
,而不是实现的
。现在,为什么它必须在void
和现在compariable
之前声明(整个实现可比较的?因此,如果我想将classclasssomething{…}
作为类型参数传递,我会得到一个错误,但是传递classsomething实现可比较的{…}
就可以了?请给我解开这个谜团:(我明天就要考试了,如果不掌握这个,我就不能做其他事情了……:(顺序:
泛型类型声明中的X扩展Y
和X超级Y
分别表示“X
is-aY
”和“Y
是X
”。java开发人员不希望添加一个新的关键字,意思是“扩展或实现”
声明在返回类型之前,可能是因为一旦声明了泛型类型变量,返回类型可能会使用其中的一些变量。顺便说一句,正如@Jack指出的,
“extensed Comparable
”是一个约束。您只能用已知的自可比类型实例化类Something
。因此Somethingsi=newsomething();
是合法的,但Something
不是,因为对象
没有实现可比
为了:
泛型类型声明中的X扩展Y
和X超级Y
分别表示“X
is-aY
”和“Y
是X
”。java开发人员不希望添加一个新的关键字,意思是“扩展或实现”
声明在返回类型之前,可能是因为一旦声明了泛型类型变量,返回类型可能会使用其中的一些变量。顺便说一句,正如@Jack指出的,
“extensed Comparable
”是一个约束。您只能用已知的自可比类型实例化类Something
。因此Somethingsi=newsomething();
是合法的,但Something
不是,因为对象
没有实现可比
首先,在Java中,您有两件事:
- 类GenericContainer之类的泛型类型
- 通用方法,如示例
public method()
前者用于定义泛型类,后者用于定义泛型类型的方法。这是两件不同的事情,尽管两者使用相同的原则
事实上,您必须明确声明方法是泛型的,如
public <T extends Comparable<T>> void myGenericMethod(...)
将工作,但您将无法在v1
或v2
上调用任何内容,您将不被允许,因为t
只是一个没有约束的泛型类型。v1.compareTo(v2)
会导致编译错误。那么,如何解决此问题
您可以对类型变量强制执行约束:
public <T extends Comparable<T>> void method(T v1, T v2)
公共作废方法(T v1,T v2)
通过这种方式,您将被强制传递到method()
同一类的实例,这些实例必须实现Comparable
,否则您将得到编译时错误。但是,您将被允许调用compareTo(…)
因为可以保证传递给方法的对象能够响应它。在Java中,首先有两件事:
- 类GenericContainer之类的泛型类型
- 通用方法,如示例
public method()
前者用于定义泛型类,后者用于定义泛型类型的方法。这是两件不同的事情,尽管两者使用相同的原则
事实上,您必须明确声明方法是泛型的,如
public <T extends Comparable<T>> void myGenericMethod(...)
将工作,但您将无法在v1
或v2
上调用任何内容,您将不被允许,因为t
只是一个没有约束的泛型类型。v1.compareTo(v2)
会导致编译错误。那么,如何解决此问题
您可以对类型变量强制执行约束:
public <T extends Comparable<T>> void method(T v1, T v2)
公共作废方法(T v1,T v2)
这样,您将被迫传递到method()
的实例