Java中的代码说明

时间:2010-04-27 08:36:32

标签: java generics

今天早上我遇到了这段代码,我完全不知道这意味着什么。谁能解释一下这些<T>代表什么?例如:

public class MyClass<T>
...

some bits of code then 

private Something<T> so;

private OtherThing<T> to;

private Class<T> c;

谢谢

5 个答案:

答案 0 :(得分:13)

你已经碰到了“泛型”。在guide {<3}}中很好地解释了它们。

简而言之,它们允许您指定存储类的类型,例如ListSet。如果你写Set<String>,你已经声明这个集合必须只包含String,并且如果你试图在其中放入其他内容,将会出现编译错误:

Set<String> stringSet = new HashSet<String>();
stringSet.add("hello"); //ok.
stringSet.add(3);
      ^^^^^^^^^^^ //does not compile

此外,泛型可以做的另一个有用的例子是它们允许你更密切地指定一个抽象类:

public abstract class AbstClass<T extends Variable> {

通过这种方式,扩展类不必扩展Variable,但是它们需要扩展扩展Variable的类。

因此,处理AbstClass的方法可以这样定义:

public void doThing(AbstClass<?> abstExtension) {

其中?是一个通配符,表示“所有使用AbstClass扩展Variable的类”。

答案 1 :(得分:5)

你在这里看到的是一种叫做泛型的东西。它们是在1.5版本中引入Java的。

您可以阅读herehere。希望这会有所帮助。

答案 2 :(得分:1)

想象一下,您正在编写List或Array类。该类必须能够保存未知类型的元素。你是怎么做到的?

Generics回答了这个问题。您看到的<T>可以被视为some type。使用泛型,您可以编写class MyList<T> { ... },在此上下文中表示a list that holds some type

作为一个用法示例,声明一个列表来存储整数,MyList<Integer> listOfInts或字符串,MyList<String> listOfStrings,或者您自己编写的一个类MyList<MyClass> listOfMyClass

答案 3 :(得分:0)

您所看到的是Java generics,它允许类和方法由其他类参数化。这在创建容器类时特别有用,因为它可以节省您为“整数列表”,“字符串列表”等创建单独的类。相反,您可以拥有一个单独的类型T的列表,其中T是一个变量“然后你可以实例化一些特定类型T的列表。注意Java泛型与C ++中的模板类型并不完全相同; Java泛型实际上使用相同的类定义,但添加隐式转换(由编译器生成)并添加其他类型检查。但是,不同的实例化实际上使用了相同的确切类型(这称为擦除),其中参数化类型被Object替换。您可以在链接中阅读更多相关信息。

答案 4 :(得分:0)

由于还没有人提及,有一个非常全面的关于泛型的指南/常见问题/教程,可以在Angelika Langer's site找到。