我开始学习Generics
,Java
阅读了一些教程,但是我有些困惑,不确定如何html" target="_blank">声明泛型方法。
当我使用泛型类型时,定义该方法的正确顺序是什么?我找到了此示例,何时需要使用尖括号,什么时候不需要?
public class Box<A> {
private A a;
...
public void setA(A a) {
this.a = a;
}
public <A> List<A> transform(List<A> in) {
return null;
}
public static <A> A getFirstElement(List<A> list) {
return null;
}
public A getA() {
return a;
}
问题是您的代码使用相同的字符A,但是在不同的地方有 几个 不同的“含义”:
public class Box<T> {
需要大括号,因为您在这里说:Box使用通用类型,称为T。
*不带花括号的T go的 *用法 :
private T a;
public void setA(T a) {
但是之后
public <T2> List<T2> transform(List<T2> in) {
正在引入 另一个 类型参数。我把它命名为T2,使之清楚,这是 不 一样的T.的想法是,在 范围 T2的是 唯一的
一个方法transform
。其他方法不了解T2!
public static <A> A getFirstElement(List<A> list) {
与上述相同-在此处为“ T3” ;-)
编辑您的评论:您不能使用 静态
方法使用类范围的类型T。这根本不可能!见这里为什么是!
编辑二:泛型允许您编写 泛型的 代码(因为它可以处理 不同的 类);但是仍然可以保证 编译时的 安全性。例:
Box<String> stringBox = new Box<>();
Box<Integer> integerBox = new Box<>();
integerBox.add("string"); // gives a COMPILER error!
在人们拥有泛型之前,他们只能在整个地方处理 Object 。和手动铸造。
问题内容: 我正在学习Java泛型,我问自己这个问题。 这两个方法声明之间有什么区别? 和 问题答案: 在后者中,您可以引用范围内的类型,即。在前者中,您不需要。
问题内容: 在没有泛型类型的类中,我想声明一个类似于以下内容的相当复杂的泛型字段: 问题是Java编译器不会让我:) 所以我的问题是如何正确地引入T和S,而又不向类Client添加类型。 我的目标是强制成为您选择的类的子类型和作为子类。 问题答案: 你不能 唯一的选择是在类声明中声明泛型类型参数。如果您的类没有泛型类型参数,则其成员不能为泛型。您必须在类成员的声明中使用实际类型。
6.1. 方法声明 在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。 下面来写我们第一个方法的例子,这个例子在package geometry下: gopl.io/ch6/geometry package geometry import "math" type Point struct{ X, Y floa
上一节展示了如何为ListOfNumbers类中的writeList方法编写异常处理程序。 有时,它适合代码捕获可能发生在其中的异常。 但在其他情况下,最好让一个方法进一步推给上层来调用堆栈处理异常。 例如,如果您将ListOfNumbers类提供为类包的一部分,则可能无法预期包的所有用户的需求。 在这种情况下,最好不要捕获异常,并允许一个方法进一步推给上层来调用堆栈来处理它。 如果writeLi
问题内容: 看完之后,我才知道,是物体。数组的名称不是实际的数组,而只是引用。new运算符在堆上创建数组,并返回对新创建的数组对象的引用,然后将其分配给数组变量(名称)。类似于以下内容: 但是我也使用了这两种类型的数组声明。 和 以上两项均合法且可以正常工作。那么这两者之间有什么区别,我应该何时使用它们? 问题答案: 这将生成一个大小为5的数组,其中包含5个null元素: 如果这些值在编译时不是您
问题内容: 我有一个带有包含泛型的参数的方法。 我想一个传递的s到这种方法。 是实现的接口。如何更改方法声明以允许这样做? 问题答案: 如果您使用的是Java 1.5版或更高版本,则可以使用通配符。 此解决方案较为通用,因为它适合的所有接口实现以及的子类/子接口。有关更多详细信息,请转到通配符教程。