1

我很难用谷歌搜索这个。我找到了很多文章,但我仍然无法解决我的问题。

这是我的代码:

List<MyMainClass> mySource = (List<MyMainClass>) session.getAttribute("myAttribute");

session.getAttribute("myAttribute")可能会返回List<MyObject1>List<MyObject2>MyObject1和都是Now I have 2 个函数MyObject2的子类。MyMainClass第一个接受List<MyObject1>,另一个接受List<MyObject2>。现在我在 Eclipse 中遇到错误

The method myMethod1(List<MyObject1>) in the type MyAction is not applicable for the arguments (List<MyMainClass>)

4

4 回答 4

1

您不能List在会话属性中安全地存储具有相同擦除 ( ) 的不同泛型类型。所以:不要这样做。

相反,无论该会话属性的列表类型如何,都可以重构您的代码,使其兼容。这可能很难,但长期对我来说似乎不那么臭。IME,当您需要将两种可能不同类型的东西存储在一个变量中时,这通常是一种糟糕的设计。

您可以交替使用两个不同的会话属性,以便知道要转换为哪种更具体的列表类型。

List<MyObject1> mySource1 = (List<MyObject1>) session.getAttribute("myAttribute1");
if (mySource1 == null) {
    List<MyObject2> mySource2 = (List<MyObject2>) session.getAttribute("myAttribute2");
    if (mySource2 == null) {
        // ???
    } else {
        // rock and roll
        myMethod2(mySource2);
    }
} else {
    // proceed
    myMethod1(mySource1);
}

如果您采用后一种方法,我建议您编写一个包装器对象或方法来为您管理这些细节。

于 2012-10-30T03:24:32.857 回答
0

如果可能的话,我建议您更改声明mySource和函数签名的方式。

以这种方式声明:

    List<? extends MyMainClass> mySource = (List<MyMainClass>) 

session.getAttribute("myAttribute");

并更改您的函数签名

returnType fun(List<Object1> object1List){
}

returnType fun(List<? extends MyMainClass> object1List){
}
于 2012-10-30T03:40:08.910 回答
0

正如建议的那样,这有点棘手。如果你真的想这样做,我认为你可以这样做:

 List<MyMainClass> mySource = 
                           (List<MyMainClass>) session.getAttribute("myAttribute");
 if(mySource != null && !mySource.isEmpty()){
      //Get the first element and check the type
      MyMainClass firstElement = mySource.get(0);
      if(firstElement instanceof MyObject1){
          List<MyObject1> mySourceObj1 = (List<MyObject1>)mySource;
          myMethod1(mySourceObj1);
      }else{
          List<MyObject3> mySourceObj2 = (List<MyObject2>)mySource;
          myMethod1(mySourceObj2);
      }
  } 
于 2012-10-30T03:36:01.423 回答
0

那是对的。泛型仅提供编译时保护。您正在尝试将更通用的列表类型传递给更具体的列表类型函数。

了解 的 实例List<MyMainClass>可以同时包含MyObject1和的实例MyObject2。当您调用function1(List<MyObject1>)此函数时,列表的所有元素都应为 type MyObject1。因此,您不能传递 type 的列表List<MyMainClass>

您需要有区分变量来存储不同类型的列表。

于 2012-10-30T03:28:57.783 回答