这件事让我难过。我有一个课程如下:
public class SpecialList implements List<MyType> {
// overriden methods
}
现在我有以下方法合同要尊重更高级别:
public class MyClass {
private List<SpecialList> bigList = new ArrayList<SpecialList>();
public void doStuff(List<MyType> list)
{
bigList.add((SpecialList)list); // does not compile - invalid cast
}
}
我真的不确定我在这里做错了什么。我有一个实现List<MyType>
接口的类,但我不能将该类转换为List<MyType>
?这对我没有任何意义。
我迷路了。我应该做些什么来完成这项工作?我想这与泛型协方差有关,但此时我不知道这里有什么问题。有人能指出正确的方向吗?感谢。
答案 0 :(得分:3)
不是每个List<MyType>
(动物)都是MyList
(牛)
您要将动物添加到奶牛名单
答案 1 :(得分:2)
我会建议一些参数:
public class MyClass{
private List<List<MyType>> bigList = new ArrayList<List<MyType>>();
public <E extends List<MyType>> void doStuff(E list)
{
bigList.add(list);
}
}
当你从bigList中检索一个元素时,你不能将该元素专门化,因为它来自通用列表。 如果你绝对需要施放它,也许你的类架构是不正确的。 或者你可以辱骂:
public class MyClass{
private List<List<MyType>> bigList = new ArrayList<List<MyType>>();
public <E extends List<MyType>> void doStuff(E list)
{
bigList.add(list);
}
public <E extends List<MyType>> E getStuff(Class<E> myType,int i)
{
List<MyType> obj = bigList.get(i);
if(myType.isInstance(obj)) return (E) obj;
throw new SomeErrorHere("invalid type for index");
}
}
答案 2 :(得分:1)
您定义了List<MyList>
(即MyList
列表)。这意味着您只能添加MyList
个实例。如果您使用addAll()
,则可以添加MyList
列表。但您正在尝试添加List<MyType>
。 MyType
绝对不是MyList
。
你显然无法将List
投射到MyList
。
答案 3 :(得分:1)
据我所知,类型转换列表的正确方法是使用泛型。类似的东西:
bigList.add((List<MyList>)(List<?>)list);
但是我不确定这段代码背后的理论。
答案 4 :(得分:1)
代码正式无误。您可以将几乎任何对象转换为任何其他对象,代码将被编译。如果强制转换无效,则会抛出运行时ClassCastException
。
您的IDE可以检测不确定的强制转换并在编译期间抱怨它们。作为警告或错误。这是一个配置问题。显然OPs IDE配置为使这样的代码闻起来编译错误
你可以回答这个问题来回答你的问题:
你能创建一个不是List<MyType>
的{{1}}吗?
您无法将SpecialList
转换为List<MyType>
,因为可能会有SpecialList
的对象,而且不会是List<MyType>
。
更改您的应用架构
您可以执行以下两项操作 - 使用您的代码中的所有课程SpecialList
,或使用通用SpecialList
。
换句话说,要么改变:
List<MyType>
至doStuff(List<MyType> list)
或更改
doStuff(SpecialList list)
至private List<SpecialList> bigList
您必须决定是否需要通用接口列表或您自己的类在任何地方使用。请记住,您可以将private List<List<MyType>> bigList
强制转换为SpecialList
,因为所有List<MyType>
个实例也是SpecialList
的实例。它反过来不起作用。
确保演员阵容始终有效
如果您绝对必须使此设计有效,请使用instanceof检查列表是否真的是List<MyType>
。像那样:
SpecialList
答案 5 :(得分:0)
这适用于我的Eclipse,这是类SpecialList,Hello是MyType类的类
package a;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class SpecialList implements List<Hello> {
//Overridden methods
}
这是Myclass
package a;
import java.util.ArrayList;
import java.util.List;
public class MyClass {
private List<SpecialList> bigList = new ArrayList<SpecialList>();
public void doStuff(List<Hello> list)
{
bigList.add((SpecialList)list); //compiles good
}
public static void main(String[] args) {
new MyClass().doStuff(null);
}
}
没有编译时错误或运行时异常
答案 6 :(得分:0)
List <MyList> is not same as List <MyType>.
让我们简单一点,看下几行:
*List<MyList> myList = new ArrayList<MyList>(); //1
myList.add(new MyType);//2 ......Compile ERROR*
如果您尝试将MyType实例添加到List<MyList>
,它将提供错误。
如果汽车部门提供司机名单。
我们认为List<Driver>
是List<Person>
,假设Driver是Person的子类型。
如果是这样的话,我们可以将不是司机的新人添加到列表中。
那就是所有人都不是司机。
您可以将Wildcards与Generics一起使用。 查看文档http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
中的此链接