我开始为Generics
学习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;
}
答案 0 :(得分:4)
问题是你的代码使用了相同的字符A,但它有几个不同的含义&#34;意思是&#34;在不同的地方:
public class Box<T> {
需要大括号,因为你在这里说:Box使用通用类型,称为T.
T的用法没有大括号:
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) {
与上述相同 - 将是&#34; T3&#34;在这里; - )
编辑您的评论:您无法使用静态方法使用全班类型T.这根本不可能!请参阅here了解原因!
编辑2:通用版允许您编写泛型的代码(因为它可以处理不同的类);但仍然给你编译时安全性。例如:
Box<String> stringBox = new Box<>();
Box<Integer> integerBox = new Box<>();
integerBox.add("string"); // gives a COMPILER error!
在人们使用仿制药之前,他们只能在整个地方处理对象;和手工铸造。
答案 1 :(得分:1)
您的示例显示了两个不同的概念:泛型类和泛型方法
这是一个引入类型参数<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) {
}
}
答案 2 :(得分:0)
如果你的方法中有一个需要返回类型的要求取决于你当时的方法参数,你可以在方法签名之前编写尖括号,如你的例子中所示,简而言之,正如单词建议Generic用于功能,其中相同的类或实用程序需要用于多种类型的对象