2013-02-09 44 views
0

我只是想知道可以重用一个泛型变量。例如,如果我有一个泛型类保存提供给它的数据库模型:泛型变量可以重用吗?

DataManager<ModelObject1> manager = new DataManager<ModelObject1>(); 
ModelObject1 object = new ModelObject1(); 
object.setSomeProperty(); 
manager.save(object); 

难道我然后再用同样的对象保存不同类型的模型,而无需创建一个新的通用变量。我怎么能这样做:

manager = null; 
manager = new DataManager<ModelObject2>(); 
ModelObject2 object2 = new ModelObject2(); 
object2.setSomeProperty(); 
manager.save(object2); 
+6

哦,而不是“物”,你的意思是“变量”。不,变量具有唯一的类型,并且泛型类的参数是类型的一部分。 – luqui 2013-02-09 23:58:08

+2

为什么要麻烦?你不会真的以任何方式保存任何内存或任何东西。重用这样的参考没有任何好处。 – 2013-02-10 00:42:55

回答

2

由于类型擦除,一个DataManager<ModelObject1>()实际上是一模一样作为DataManager<ModelObject2>()在创建时间,从这个角度看没有理由为什么它不应该被重用 - 正确的铸造之后。

但是,有一些注意事项。如果修改了对象包含的东西的引用是特定的定义类,然后事情就变得复杂:

喜欢的东西,这将意味着你不能再使用安全的目标:

DataManager<ModelObject1> manager = new DataManager<ModelObject1>(); 
manager.setObject(new ModelObject1()); 

我会然而,如果没有很好的理由,强烈反对。也许如果创建经理是一个非常繁重的过程,你可以证明重复使用它们是合理的。

此代码编译好,但我会stongly建议投之前ss.clear()或之后is.clear()否则你会最终有一个Set<integer>含有String

public static void main(String[] args) { 
    Set<String> ss = new HashSet<String>(); 
    ss.add("Hello"); 
    Set<Integer> is = unsecureCast(ss); 
} 

static Set<Integer> unsecureCast(Set s) { 
    return (Set<Integer>) s; 
} 
+0

我不确定为什么这个答案被接受,因为它与OP询问的完全相反。这是指将相同的实例分配给不兼容的泛型的不同引用(坏主意)。 OP询问如何将一个不兼容的泛型类型的新实例分配给同一个引用(这也是一个坏主意并且毫无意义)。 – 2013-02-10 05:07:05

+0

@PaulBellora - 我想我在某种程度上同意你的意见。但是,如果您直到(但不包括)读取问题*我该如何做这样的事情:...... *当我回答时,问题的表现方式如何,您可能会发现我实际上回答了OP最初意味着的问题问,即*我可以重复使用相同的对象来保存不同类型的模型?* – OldCurmudgeon 2013-02-10 15:07:55

+0

嗯,也许你是对的。我想知道我在这个问题上的错误是否是故意的。其他人似乎也有类似的困惑,并将“对象”编辑为“可变”。 – 2013-02-10 15:46:46

3

这不会编译。您不能将DataManager<ModelObject2>分配给类型为DataManager<ModelObject1>的变量,因为它们不是同一类型。

相关问题