今天早上我遇到了这段代码,我完全不知道这意味着什么。谁能解释一下这些<T>
代表什么?例如:
public class MyClass<T>
...
some bits of code then
private Something<T> so;
private OtherThing<T> to;
private Class<T> c;
谢谢
答案 0 :(得分:13)
你已经碰到了“泛型”。在guide {<3}}中很好地解释了它们。
简而言之,它们允许您指定存储类的类型,例如List
或Set
。如果你写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)
答案 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找到。