Java 将具体对象列表强制转换为抽象类型

Java 将具体对象列表强制转换为抽象类型,java,Java,以前有人问过这个问题,但是解决方案显示了一个警告,说“uncheckedcast”。有没有更安全的方法。代码如下所示 public abstract class Animal { . .. public class Dog extends Animal{ .. public Vector<Animal> myFunc(String[] args) { // TODO Auto-generated method stub Vector<

以前有人问过这个问题,但是解决方案显示了一个警告,说“uncheckedcast”。有没有更安全的方法。代码如下所示

public abstract class Animal {
.
..
public class Dog extends Animal{

..
    public Vector<Animal> myFunc(String[] args) {
        // TODO Auto-generated method stub

        Vector<Dog> arVector = new Vector<Dog>();
        return  (Vector<Animal>)(List<?>) arVector; 

    }
公共抽象类动物{
.
..
公家犬{
..
公共向量myFunc(字符串[]args){
//TODO自动生成的方法存根
向量arVector=新向量();
返回(向量)(列表)arVector;
}
这不安全,因为:

Vector<Dog> dogVector = new Vector<Dog>();
Vector<Animal> animalVector = (Vector<Animal>)(List<?>) dogVector;
animalVector.add(new Animal()); // seems to be ok, but...
Dog dog = dogVector.get(0); // Runtime exception - there's Animal, not Dog in your Vector.
Vector dogVector=新向量();
向量animalVector=(向量)(列表)dogVector;
animalVector.add(new Animal());//看起来还可以,但是。。。
Dog Dog=dogVector.get(0);//运行时异常-向量中有动物,而不是狗。
编译器不允许您使用不同的泛型类型强制转换类型是有原因的。您可以绕过此限制,但这可能会导致运行时出现严重问题(*ClassCastException*s)

编辑:

问题是,你必须返回一个带有动物的向量,但你根据某些条件创建狗或猫的向量。你可以做的是:

public Vector<? extends Animal> myFunc(String[] args) {
   Vector<Dog> vector = new Vector<Dog>();
   // ...
   return vector;
}

public Vector可能与重复。另请参见:。@learningtocode我不知道您到底想实现什么。显然,将Vector转换为Vector是个坏主意,但您没有解释为什么需要这样的转换。我有一个方法需要返回动物列表。该方法根据一些输入创建狗或猫列表,然后链接中的e解决方案建议使用通配符,但它似乎不安全。那么有更安全的解决方案吗?您可以返回VectorThat似乎有效,我不知道您可以将狗和猫添加到动物列表中。编译器认为这样做是安全的,对此我感到非常荣幸:)再次感谢!它是安全的,因为您只能从该列表中检索动物,而不能这样做gs或猫。当然它们(事实上)是狗或猫,但它们的类型(编译器已知)是动物,所以你只能用它们做动物的事情——除非你明确地把它们归为狗或猫。附言。如果有帮助,你可以接受这个答案:)
public Vector<Animal> myFunc(String[] args) {
   Vector<Animal> vector = new Vector<Animal>();
   vector.add(new Dog());
   return vector;
}