2012-08-06 22 views
2

泛型集合中的数据类型检查是如何发生的?例如,看看下面的ArrayList:了解泛型以及类型检查的工作方式

ArrayList<String> r1 = new ArrayList<String>(); 
r1.add("4"); 
r1.add("1"); 
r1.add("2"); 
r1.add("3"); 

ArrayList<String>如何链接到的方法add()?如果我要创建我自己的不是集合的类,那么如何绑定泛型参数以确保严格的类型检查发生?

又如我Android中观察到的与所述的AsyncTask类:

private class SomeAsyncTask extends AsyncTask<String, Integer, Long> { 

其中字符串是指输入,整型的进步和长到响应。这个映射在哪里完成?我如何创建自己的泛型类,并在哪里定义这个映射?

+1

除了答案:类型检查只能由编译器完成。运行时不检查。 – 2012-08-06 13:34:05

回答

2

第一个问题

看看在Generic Types Tutorial for Java。一个例子可以解释这一点:

Tuple<String, Integer> tuple = new Tuple<String, Integer>("Hello", 1);

和类型参数检查在编译时间都是在这里完成:

public class Tuple<X, Y> { 

    X first; 
    Y second; 

    public Tuple(X first, Y second) { 
     this.first = first;  
     this.second = second; 
    } 
} 

当你实例化这个类,你可以用下面这行做到这一点,例如,因为构造函数现在期望StringInteger作为参数(按此顺序)。

第二个问题

我希望元组例如已经明确了映射如何实现:用不同的泛型类型参数的名称。

在类型参数定义中使用AsyncTask的情况下也是这样,使用不同的名称,例如:AsyncTask<A, B, C>,因此可以在应用每个名称时区分它们。

对于在source code of AsyncTask,其中类的定义来看一看:

public abstract class AsyncTask<Params, Progress, Result> 

类型参数名不必是一个单个字母,它也可以是一个完整的名字。

+0

我实例化ArrayList ()没有参数。但是ArrayList类如何知道类型检查应该在add()方法中完成。如果我有一种将字符串转换为对象的方法,并且我不需要类型检查?这个检查在哪里完成? – 2012-08-06 13:51:59

+0

@WDoDoGG你的意思是调用'new ArrayList()',从而省略泛型类型参数?结果是一个包含原始类型的列表。 **原始类型**没有类型安全性,因此不进行检查。您可以在以下问题的答案中阅读关于此主题的更多信息[什么是原始类型,为什么我们不应该使用它?](http://stackoverflow.com/questions/2770321/what-is-a-raw型和 - 为什么 - 不应该,我们使用 - 它)。 – 2012-08-06 14:06:57

+0

@WDoDoGG关于将字符串转换为对象的方法:如果不知道用例或者想要完成什么,我不能一般回答这个问题。 – 2012-08-06 14:11:18

3

这是我的看法,泛型是一个广泛的主题太多作为回应体面覆盖。我建议你首先看一下Oracle的教程(here)以获取所有你需要的信息。

话虽这么说,作为一个快速的回答,.add()方法,按照android documentation,需要一个泛型参数E,这是指定创建列表时,你的情况这是一个字符串相同的参数。

其次,创建自己的泛型类,它是做一些像这样简单:

在上述情况下,T指泛型参数。当您实例化您的课程时,该参数会被设置,例如... new MyClass<String>();

3

如果你想创建一个具有doSomething方法的泛型类,你可以写:

class GenericClass<E> { 
    public void doSomething(E aThing) { 
     //do something with aThing 
    } 
} 

您现在可以使用它“像”一个ArrayList:

GenericClass<String> myGeneric = new GenericClass<String>(); 
myGeneric.doSomething("abc"); 

GenericClass<Integer> myGeneric2 = new GenericClass<Integer>(); 
myGeneric.doSomething(123); 

现在,如果你想知道更多关于ArrayList是如何实现的,最好的做法是to check the code