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> {

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

4

3 回答 3

3

我认为泛型是一个过于宽泛的主题,无法作为回应体面地涵盖。我建议您首先查看 Oracle 的教程(此处),了解您应该需要的所有信息。

话虽这么说,作为一个快速的答案,根据android 文档.add(),该方法采用通用参数,该参数与创建列表时指定的参数相同,在您的情况下,这是一个字符串。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>();.

于 2012-08-06T13:27:26.010 回答
3

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

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

您现在可以“像”数组列表一样使用它:

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

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

现在,如果您想进一步了解 ArrayList 是如何实现的,最好的办法就是检查代码

于 2012-08-06T13:27:33.423 回答
2

第一个问题

查看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);

并且类型参数检查在编译时在这里完成,因为构造函数现在需要String一个Integeras 参数(按此顺序)。

第二个问题

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

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

为此,请查看AsyncTask 的源代码,其中类定义为:

public abstract class AsyncTask<Params, Progress, Result>

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

于 2012-08-06T13:27:13.853 回答