У меня есть абстрактный класс w / 1 метод установки - параметр является объектом. Я хочу общий параметр <T>, который принимает тип расширяющего его класса - PullRequest
1 голос
/ 15 июня 2019

Что я хочу:

Вместо метода "Object" в методе "public void insertDog (Object object)" я бы хотел универсальный шаблон, расширяющий класс, расширяющий абстрактный класс "DogKennel".Например, если я создаю класс с именем «RetrieverDogKennel», который расширяет «DogKennel», я бы хотел, чтобы параметр метода «insertDog (...)» класса «RetrieverDogKennel» принимал только объекты «Retriever».Хотя этот метод не будет выглядеть как «insertDog (Retriever Retriever)», метод будет действовать так, как если бы в его параметре были только объекты Retriever.

public abstract class DogKennel
{

   public void insertDog(Object object)
   {

   //does something and the object is not stored

   }

}

public class RetrieverDogKennel extends DogKennel
{

   public <T extends Retriever> void insertDog(T object)
   {

   //does something and the object is not stored

   }

}

Если вы попытаетесь поместить другую породу собак в RetrieverDogKennelЯ хочу, чтобы это было ошибкой.

LabradorDogKennel labradorDogKennel = new LabradorDogKennel();
RetrieverDogKennel retrieverDogKennel = new LabradorDogKennel();

Labrador bullet = new Labrador(); 
Retriever buster = new Retriever();
Retriever sparky = new Retriever();



//No Error
retrieverDogKennel.insertDog(buster);

//Error
retrieverDogKennel.insertDog(bullet);

1 Ответ

1 голос
/ 15 июня 2019

ОБНОВЛЕНО

Вам нужно сделать оба класса общими, а не метод подкласса:

public interface Dog {
}

public class Labrador implements Dog
{
}

public abstract class DogKennel<T extends Dog> {

    public void insertDog(T dog) {
        //does something and the dog is not stored
    }

}

public final class RetrieverDogKennel extends DogKennel<Retriever> {
}

public final class GeneralDogKennel extends DogKennel<Dog> {
}

С этим кодом класс RetrieverDogKennel имеет метод insertDog(Retriever dog) с реализацией, унаследованной от базового класса.

В классе GeneralDogKennel есть метод insertDog(Dog dog), то есть он принимает любую собаку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...