2011-07-07 268 views
88

我目前正在学习Java,最近被尖括号难倒(<>)。他们究竟是什么意思?什么是<T>(尖括号)在Java中的含义?

public class Pool<T>{ 
    public interface PoolFactory<T>{ 
     public T createObject(); 
    } 
    this.freeObjects= new ArrayList<T>(maxsize) 
} 

<T>是什么意思?这是否意味着我可以创建一个T类型的对象?

+8

谷歌Java的泛型 –

+4

我觉得很难解析你的代码。开始时没有缩进,并且有两个开放的大括号,并且只有一个关闭。 'T createObject'应该在Pool还是PoolFactory中? 'this.freeObjects = ...'应该是什么?那是一个单独的例子吗?在那里拥有它是非法的;它必须在一个方法内。 – mgiuca

+0

如果有人正在寻找有关'<>'(钻石算子)的信息,可以像'List list = new ArrayList <>();'一样使用,请访问https://docs.oracle.com/javase/7/docs /technotes/guides/language/type-in​​ference-generic-instance-creation.html。 – Pshemo

回答

4

<>用于表示Java中的generics

T是本例中的一个类型参数。和否:实例化是你不能T做的几件事情之一。

除了上面链接的教程Angelika Langers Generics FAQ是关于这个话题的很好的资源。

6

被称为通用类型。您可以这样实例化对象池:

PoolFactory<Integer> pool = new Pool<Integer>(); 

通用参数只能是引用类型。所以你不能使用像int或double或者char或其他基本类型这样的基本类型。

101

<T>通用,通常可以读为“T型”。它取决于<左侧的类型>它的实际含义。

我不知道PoolPoolFactory是什么,但你也提到ArrayList<T>,这是一个标准的Java类,所以我会谈谈这一点。

通常情况下,你不会在那里看到“T”,你会看到另一种类型。因此,如果您看到例如ArrayList<Integer>,那意味着“的Integer s”。例如,许多类使用泛型来约束容器中元素的类型。另一个例子是HashMap<String, Integer>,意思是“一个带有String键和Integer值的地图。”

您的泳池示例有点不同,因为您在定义了一类。因此,在这种情况下,您正在创建一个类,其他人可以使用特定类型来实例化T。例如,我可以使用您的类定义创建类型为Pool<String>的对象。这将意味着两件事情:

  • Pool<String>将有一个createObject方法返回String秒的接口PoolFactory<String>
  • 在内部,Pool<String>将包含Strings的ArrayList

这是个好消息,因为在其他时间,我可以一起去,并创建一个Pool<Integer>这将使用相同的代码,但是有Integer无论你在源看到T

16

它与java中的泛型相关。如果我提到ArrayList<String>这意味着我只能将String类型对象添加到该ArrayList。

在Java泛型的两个主要好处是:

  1. 降低铸件的数量在你的程序中,从而减少在你的程序中潜在的错误的数量。
  2. 提高代码清晰度
1
通用

类是一类类的,在一个数据类型作为参数它的创建时。此类型参数使用尖括号指定,并且类型可以在每次实例化类的新实例时更改。例如,让我们创建Employee对象一个ArrayList,另一个是公司对象

ArrayList<Employee> employees = new ArrayList<Employee>(); 
ArrayList<Company> companies = new ArrayList<Company>(); 

你会发现,我们使用相同的ArrayList类创建两个列表,我们的员工和公司类型使用角度传括号。让一个泛型类能够处理多种类型的数据可以减少执行类似任务的许多类。泛型也有助于通过给所有的强类型减少bug,这有助于编译器指出错误。通过为ArrayList指定一个类型,如果您尝试将Employee添加到公司列表中,则编译器会引发错误,反之亦然。

10

这很简单。这是J2SE 5中引入的新功能。在类名后面指定尖括号意味着您正在创建可以容纳任何类型数据的临时数据类型。

例子:

class A<T>{ 
    T obj; 
    void add(T obj){ 
     this.obj=obj; 
    } 
    T get(){ 
     return obj; 
    } 
} 
public class generics { 
    static<E> void print(E[] elements){ 
     for(E element:elements){ 
      System.out.println(element); 
     } 
    } 

    public static void main(String[] args) { 
     A<String> obj=new A<String>(); 
     A<Integer> obj1=new A<Integer>(); 
     obj.add("hello"); 
     obj1.add(6); 
     System.out.println(obj.get()); 
     System.out.println(obj1.get()); 

     Integer[] arr={1,3,5,7}; 
     print(arr); 
    } 
} 

相反的<T>,实际上你可以写任何东西,它的工作方式相同。试着写<ABC>代替<T>

这仅仅是为了方便起见:

  • <T>被称为任何类型
  • <E>作为元素类型
  • <N>作为号码类型
  • <V>作为值
  • <K>作为关键

但是你可以将它命名为任何你想要的东西,这并不重要。

此外,Integer,String,Boolean等都是Java的包装类,它们有助于在编译期间检查类型。例如,在上面的代码中,obj的类型是String,因此您无法向其中添加任何其他类型(尝试obj.add(1),它会投出错误)。同样,obj1Integer类型,您不能添加任何其他类型(尝试obj1.add("hello"),错误将在那里)。

相关问题