2010-04-27 60 views
5

今天早上我遇到了这个代码,我完全不知道这意味着什么。任何人都可以解释一下这些<T>代表什么?例如:Java中的代码解释

public class MyClass<T> 
... 

some bits of code then 

private Something<T> so; 

private OtherThing<T> to; 

private Class<T> c; 

谢谢

回答

13

你碰到了“仿制药”。他们在这个guide很好地解释。

简而言之,它们允许您指定存储级别的类型,例如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) { 

其中?是一个通配符,意思是“与某些Variable延伸AbstClass所有类”。

+0

@Lars Andren好的我想我得到了解释,为什么有人会在类名中使用泛型,我的意思是有没有使用它的应用程序使用它呢? – 2010-04-28 09:53:10

+0

您不能真正将泛型添加到类名称,但可以将泛型添加到类标题(定义)中。使用它的优点是铸造次数更少,可读性更高; http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#Topic1 – 2010-06-29 00:45:38

5

你在这里看到的是一种叫泛型什么。他们在1.5版本中引入了Java。

你可以阅读关于他们herehere。希望这可以帮助。

0

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

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

0

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

+0

其实,这已经从拉斯安德伦的答案链接:http://stackoverflow.com/questions/2719776/code-explanation-in-爪哇/ 2719918#2719918 – Jonik 2010-04-27 17:05:06