泛型。创建2个对象并将它们添加到另一个对象

时间:2013-10-28 17:06:51

标签: java generics

我希望有人能指导我朝着正确的方向前进。我必须创建2个狗对象,然后将它们添加到MyPets对象作为myFirstPet和mySecondPet。我有多个类,如Animal,Dog,Greyhound,它实现了Comparable接口和MyPets(泛型类)。

MyPets类:

public class MyPets<T> {

    private T myFirstPet;
    private T mySecondPet;

    public void setMyFirstPet(T myFirstPet) {
        this.myFirstPet = myFirstPet;
    }

    public void setMySecondPet(T mySecondPet) {
        this.mySecondPet = mySecondPet;
    }

    public T getMyFirstPet(){
        return myFirstPet;
    }

    public T getMySecondPet(){
        return mySecondPet;
    }

    @Override
    public String toString() {
        return "My first pet " + myFirstPet + ", my second pet "
                + mySecondPet;
    }
}

TestClass类有main:

public class TestClass {

    public static void main(String[] args) {

        MyPets<Dog> dog = new MyPets();
        MyPets<Dog> doggie = new MyPets();

    }
}

我不确定我需要做什么才能将2个狗对象添加到MyPets对象作为myFirstPet和mySecondPet。我甚至不知道我是否正确地创建了Dog对象。

4 个答案:

答案 0 :(得分:0)

您的测试必须如下:

    public class TestClass {

        public static void main(String[] args) {

            MyPets<Dog> pets = new MyPets();
            Dog first = new Dog();
            Dog second = new Dog();
            pets.setMyFirstPet(first);
            pets.setMySecondPet(second);

        }
    }

答案 1 :(得分:0)

小心......你实际上没有创建任何Dog个对象;而是创建了两个MyPets对象。但由于每个MyPets 本身实际上只是其他Animal个对象的列表,因此将MyPets的实例视为{{}是没有意义的1}}。

您的代码应该看起来像:

Dog

答案 2 :(得分:0)

看起来你在泛型语法中迷失了方向。您需要区分(概念MyPets<Dog>对象与Dog对象之间的区别。

您的任务是创建两个Dog个对象,然后将它们添加到单个MyPets<Dog>对象中。您上面编写的代码创建了两个MyPets个对象,但没有Dog个对象。此外,它不使用您编写的任何函数(setMyFirstPet等) - 经常签署这样的分配,您的逻辑缺少一步。

你的main方法应该是什么样的(摘要,以避免为你工作)是这样的:

  • 创建MyPets<Dog>对象。
  • 创建两个Dog个对象。
  • Dog个对象添加到MyPets对象(使用setMy[First/Second]Pet方法)。

答案 3 :(得分:0)

您编写的类存储了同一对象的对(请不要在此讨论继承)。假设您有两个类CatDog,并且您希望存储对这些类型的对象的引用使用你的课,你这样做:

MyPets<Dog> myDogs = new MyPets<Dog>();
myDogs.setMyFirstPet(new Dog("Roger"));/*Assuming this is your dog constructor*/
myDogs.setMySecondPet(new Dog("Rocket"));
System.out.println(myDogs);
MyPets<Cat> myCats = new MyPets<Cat>();
myCats.setMyFirstPet(new Cat(/*A cat name*/));
myCats.setMySecondPet(new Cat(/*Another cat name*/));

仿制药有许多微妙之处。您应该记住的一件事是,在运行时,没有T.您的MyPets类中的T转换为Object类型的引用。 T仅在编译时使用,以确保传递给MyPets的对象确实是T类型。在上面的代码中,如果将Cat对象传递给MyPets,其中T = Dog,那将是编译时错误,而不是运行时。