我正在学习Head First Java,但我无法理解

时间:2009-08-27 00:24:20

标签: java generics

“当您为类声明一个类型参数时,您可以简单地在任何使用实类或接口类型的地方使用该类型。在方法参数中声明的类型基本上替换为您在使用时使用的类型你实例化了这个类。

如果类本身不使用类型参数,您仍然可以通过在返回类型之前在异常(但可用)空间中声明它来为方法指定一个,此方法表示T可以是“任何类型的动物“。”

你能解释一下吗?

3 个答案:

答案 0 :(得分:7)

这意味着在泛型类中,您可以编写如下方法:

public T doSomething () {
}

请注意,返回类型为“T”。

在编译时,该方法的返回类型将是您在实例化时传递给泛型类的任何内容。

答案 1 :(得分:1)

class Zoo<T> {
   static void putAnimal(T animal) {
       // do stuff
   }
}

Zoo<Ape> apeZoo = new Zoo<Ape>(); // you can now put apes (and chimps) here
Zoo<Reptile> monkeyZoo = new Zoo<Reptile>(); // this zoo takes reptiles

apeZoo.putAnimal(new Chimp());
monkeyZoo.putAnimal(new Tortoise());

答案 2 :(得分:1)

对于第一段,这就是泛型如何为类工作。例如,对于list,您可以创建泛型类型的列表,例如整数,例如:

ArrayList<Integer> list = new ArrayList<Integer>();

(在实际代码中,您当然使用List<Integer>

现在ArrayList将被定义为:

public class Arraylist<T> { // implements....

    // ...

    public T get(int index) {
         // ...
    }
}

get上使用list方法并获得Integer的原因是什么(因为我们创建了类ArrayList<Integer>的类,因此{{1} })。否则,编译器将不知道列表存储了什么类型的对象,并且您必须使用该方法返回T = Integer,这是以前的方式。

第二段的含义是您可以像对类一样向方法添加类型参数。 e.g:

Object
例如,这将允许您创建一个返回T类型的静态实用程序方法。返回T列表的第一个元素:

public <T> void noOp(T element) {
    // code here
}

你可以以强类型的方式使用这种方法。建议更好的例子欢迎。 : - )

编辑:我刚刚意识到我曾经写过一些使用此功能的东西。我一直在使用JPA API并且一直非常烦恼,你必须从查询中返回一些东西(列表或单个项目),然后运行到未经检查的类型警告,因为这里无法推断出类型。如果您像我一样并且试图避免在代码中出现警告,则必须每次都禁止警告。所以我写了这个方法来压制警告:

public static <T> T getFirst (List<T> list) {
    return list.get(0);
}

通过类型推理的魔力可以解决这个问题:

@SuppressWarnings("unchecked")
public static <T> List<T> returnResultList(Query query) {
    return (List<T>)query.getResultList();
}