有人可以向我解释为什么类不是Java中的第一类对象吗?有一些模式可以很好地工作,如果它和我一直在编写带有getter和setter的工厂类,只是添加不必要的类,这样我就可以将实例传递给方法而不是实际的类来分解泛型代码.例如:
public class AsyncBookSearch extends AsyncTask<String,BookItem,Void> {
public ListView list;
public AmazonItemAdapter<BookItem> adapter;
public AsyncBookSearch(ListView l,AmazonItemAdapter<BookItem> ad) {
list = l;
adapter = ad;
}
@Override
protected Void doInBackground(String... keywords) {
// TODO Auto-generated method stub
new BookSearch(keywords[0],list,adapter).parse();
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我有几个这样的类,如果我想让整个事物变得通用,那么这些内容doInBackground()会导致在参数传递中出现一些额外的方法和其他类型的重复,如果我可以编写以下内容则不会有问题:
public class AsyncItemSearch<T extends GenericItemSearch<S>,S extends GenericItem> extends AsyncTask<String,T,Void> {
public ListView list;
public AmazonItemAdapter<S> adapter;
public AsyncBookSearch(ListView l,AmazonItemAdapter<S> ad) {
list = l;
adapter = ad;
}
@Override
protected Void doInBackground(String... keywords) {
// TODO Auto-generated method stub
new T(keywords[0],list,adapter).parse();
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
目前我无法在Java中编写类似的代码.我必须在所涉及的每个类中引入不必要的耦合,这只会使事情变得更加复杂,因为现在不仅每个实例都需要担心它自己的状态,而且还需要关注与它的任务完全无关的对象中的状态.
我不认为你的问题实际上是关于类是"第一类"对象.我怀疑它与java如何处理泛型有关.我认为你需要理解类型擦除:在你的例子中,你基本上想要写类似的东西
void foo<T>{
T bar = new T();
}
Run Code Online (Sandbox Code Playgroud)
但这是不可能的,因为在运行时,由于类型擦除,没有关于T类实际是什么的信息:
当实例化泛型类型时,编译器通过称为类型擦除的技术来转换这些类型 - 这是一种编译器删除与类型参数相关的所有信息并在类或方法中键入参数的过程.类型擦除使得使用泛型的Java应用程序能够维护与泛型之前创建的Java库和应用程序的二进制兼容性.
| 归档时间: |
|
| 查看次数: |
1097 次 |
| 最近记录: |