我开始学习Genericsfor Java,并阅读了一些教程,但我有点困惑,也不确定如何声明泛型方法。
当我使用泛型类型时,定义方法的正确顺序是什么?我发现了这个例子,我什么时候需要使用尖括号,什么时候不用?
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;
}发布于 2016-09-14 10:20:15
问题是您的代码使用的是相同的字符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,这是完全不可能的!请参阅这里的原因!
编辑2:泛型允许您编写代码,即泛型(因为它可以处理不同的类);但仍然为您提供了安全性。示例:
Box<String> stringBox = new Box<>();
Box<Integer> integerBox = new Box<>();
integerBox.add("string"); // gives a COMPILER error!在人们拥有泛型之前,他们只能处理整个地方的对象;以及手动转换。
发布于 2016-09-14 10:23:48
您的示例展示了两个不同的概念:泛型类和泛型方法。
这是一个引入类型参数<A>的泛型类。
public class Box<A> {
}虽然这些是通用方法,但是引入了它们自己的类型参数<A>
public <A> List<A> transform(List<A> in) {
return null;
}
public static <A> A getFirstElement(List<A> list) {
return null;
}将其与具有特定名称的字段的类和具有该名称的参数的方法进行比较:
public class Box {
private String name;
publix Box(String name) {
}
}发布于 2016-09-14 10:22:03
如果您的方法中有需要返回类型的需求,则此时类型取决于您的方法参数,则可以在方法签名之前写入角括号,如示例中所示,简单地说,word建议泛型用于用于多种类型对象的相同类或实用程序的特性。
https://stackoverflow.com/questions/39487877
复制相似问题