以下两种方法可以很好地编制并完成它们的作用。
public int returnArray()[]
{
int a[]={1 ,2};
return a;
}
public String[] returnArray(String[] array[])[]
{
return array;
}
根据这种方法签名,我们不能以某种方式拥有如下的方法签名吗?
public <T>List rerurnList(List<T> list)<T>
{
return new ArrayList<T>();
}
此方法旨在返回java.util.List
泛型类型。 无法编译。为了成功编译,必须按如下方式进行修改。
public <T>List<T> rerurnList(List<T> list)
{
return new ArrayList<T>();
}
在这种情况下,我们不能像第一种情况一样拥有方法签名吗?
答案 0 :(得分:6)
由于某些原因,Java允许您像在C中一样定义数组,在变量或方法名称之后添加[]
修饰符。然而,这对于泛型来说是不可能的。
通用类型参数有与类型一起声明,因为它们是类型描述符的一部分。数组也应该这样声明,因为它们也是类型描述符的一部分。
为了理解为什么编译器不允许你以这种方式写东西(为什么不应该让你像第一个例子那样写东西),我们需要把它分解为件。
public int returnArray()[] { ... }
public
:可见性声明int
:返回类型,整数returnArray
:方法名称()
:参数列表(空)[]
:哎呀!返回类型实际上是我们之前所说的数组这更好:
public String[] returnArray(String[] array[])[]
public
:可见性声明String[]
:返回类型,字符串数组returnArray
:方法名称(String[] array[])
:参数列表......
String[]
:参数的类型,字符串数组array
:参数名称[]
:哎呀!参数类型实际上是我们之前所说的数组[]
:再次呐喊!返回类型实际上是我们之前所说的数组脚注:不要这样做,只在类型中指定类型。而不是String[] array[]
,请使用String[][] array
。
现在数组的东西语法很清楚了,我希望你理解为什么应该错误,让我们从generig开始:
public <T> List<T> rerurnList(List<T> list) { ... }
public
:可见性声明<T>
:此方法使用泛型T
List<T>
:返回类型,List
T
rerurnList
:方法名称(List<T> list)
:参数列表
List<T>
:List
T
list
:参数名称答案 1 :(得分:3)
回答你的问题:你正在为编译失败的方法尝试的语法肯定是错误的,因为参数列表和方法体之间放置了<T>
:
(List<T> list)<T>{
这根本不是有效的Java语法。这不是你如何标记一般方法。您已经通过在方法访问修饰符和返回类型之间放置类型参数 - <P>
- 将该方法标记为通用。