如何在通用集合中检查数据类型?例如,看看下面的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表示响应。这个映射在哪里完成?如何创建自己的泛型类以及在何处定义此映射?
答案 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);
并且在编译期间完成了类型参数检查,因为构造函数现在需要String
和Integer
作为参数(按此顺序)。
第二个问题
我希望元组示例已经明确了如何完成映射:使用不同的泛型类型参数名称。
在类型参数定义中AsyncTask
的情况下也是如此,使用了不同的名称,例如:AsyncTask<A, B, C>
,因此在应用它们时可以区分它们。
为此,请查看source code of AsyncTask,其中类定义为:
public abstract class AsyncTask<Params, Progress, Result>
类型参数名称不必是单个字母,也可以是整个名称。