因此,好的 ol' Dietel指出,“所有泛型方法声明都有一个由尖括号(< 和 >)分隔的类型参数部分,位于方法返回类型之前”(Deitel,2012 年,斜体强调是我的)。给出的例子如下:
public static < T > void printArray (T[] inputArray)
{
for (T element : inputArray)
(
System.out.printlf("%s", element);
}
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义。我明白了。但是,这是我的问题,书中没有明确解决。
我有一个非常简单的类来演示:
public class Pair<F, S>
{
private F first;
private S second;
}
Run Code Online (Sandbox Code Playgroud)
现在,根据 Deitel 的说法,“ ALL ”泛型方法声明必须包含类型参数部分。因此,很自然地,我想在我的类示例中添加一个get()and方法。set()所以,我这样做:
public class Pair<F, S>
{
private F first;
private S second;
// Here, I'll do one instead of both for the sake of shortening the code
public < F > F getF()
{
return F;
}
// And the Accessor:
public < F > void setF(F first)
{
this.first = first;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,这就是交易。在我尝试编译(Intellisense 的 Java 版本)之前,Eclipse IDE 向我发出警告,指出“类型参数 F 正在隐藏类型 F”。现在,我对 Java 版的Dietel不太信任,并且逐渐认识到它们并不是特别可靠(因为它们常常遗漏了重要的区别)。因此,我查阅了Oracle 文档了解我正在做的事情,猜猜看,他们没有提到任何此类内容,除非您谈论的是“上限”类型参数。
这是问题(有三个):
JLS 特别将泛型方法指定为声明类型参数的方法。( JLS ) 所以这里的混乱在于 Deital 说过“所有泛型方法都有一个类型参数部分”,但可能没有具体指出这是他们的定义。更清楚地说“泛型方法是具有类型参数部分的方法”。
正如注释中所指出的,当您具有由类声明的类型参数时,您不需要在方法中重新声明它们。正如 Eclipse 所指出的,这样做实际上声明了新的类型参数,这些参数隐藏了类声明的参数。
当它们在类上声明时,您可以直接使用它们:
class Pair<F, S> {
F getF() { ... }
S getS() { ... }
void setF(F f) { ... }
void setS(S s) { ... }
}
Run Code Online (Sandbox Code Playgroud)
泛型方法的目的是参数化地使用它。给定的示例不太适合理解,因为泛型类型实际上未使用:printf调用了 Object 的重载。它可以在不使用泛型的情况下重写,而不会改变其功能:
public static void printArray(Object[] arr) {
for(Object o : arr) {
System.out.printf("%s", o);
}
}
Run Code Online (Sandbox Code Playgroud)
理解泛型方法的使用的最简单的例子是其实现,Objects#requireNonNull如下所示:
public static <T> T requireNonNull(T obj) {
if(obj == null)
throw new NullPointerException();
return obj;
}
Run Code Online (Sandbox Code Playgroud)
它接受任何对象并方便地将其返回为T:
// T is inferred
String hello = Objects.requireNonNull("hello world");
// T is provided as a witness (rarely necessary)
Integer five = Objects.<Integer>requireNonNull(5);
Run Code Online (Sandbox Code Playgroud)
这是最简单的通用方法。
| 归档时间: |
|
| 查看次数: |
1894 次 |
| 最近记录: |