了解泛型以及类型检查的工作原理

时间:2012-08-06 13:23:32

标签: java android generics

如何在通用集合中检查数据类型?例如,看看下面的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> {

其中String表示输入,Integer表示进度,Long表示响应。这个映射在哪里完成?如何创建自己的泛型类以及在何处定义此映射?

3 个答案:

答案 0 :(得分:3)

我认为,仿制药作为一种回应,可以作为一个广泛的主题。我建议您首先查看Oracle的教程(here),了解您应该需要的所有信息。

话虽如此,作为一个快速回答,.add()方法,根据android documentation,采用通用参数E,这是创建列表时指定的相同参数,在你的情况下,这是一个字符串。

其次,要创建自己的泛型类,就像执行类似的操作一样简单:

public MyClass<T>
{
    private T myT;

    public void set(T t)
    {
        this.myT = t;
    }

    public T get()
    {
       return this.myT;
    }
}

在上面的例子中,T指的是通用参数。实例化类时会设置该参数,例如... new MyClass<String>();

答案 1 :(得分: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

答案 2 :(得分:2)

第一个问题

看看Generic Types Tutorial for Java。一个例子可能会澄清这一点:

public class Tuple<X, Y> {

   X first;
   Y second;

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

当您实例化此类时,您可以使用以下行来执行此操作:

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

并且在编译期间完成了类型参数检查,因为构造函数现在需要StringInteger作为参数(按此顺序)。

第二个问题

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

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

为此,请查看source code of AsyncTask,其中类定义为:

public abstract class AsyncTask<Params, Progress, Result>

类型参数名称不必是单个字母,也可以是整个名称。