【问题标题】:I have an abstract class w/ 1 setter method - parameter is an object. I want a generic <T> parameter that takes on the type of the class extending it我有一个带有 1 个 setter 方法的抽象类 - 参数是一个对象。我想要一个通用的 <T> 参数,它采用扩展它的类的类型
【发布时间】:2019-10-29 13:03:07
【问题描述】:

我想要什么:

代替“public void insertDog(Object object)”方法中的“Object”,我想要一个扩展抽象类“DogKennel”的类的泛型。例如,如果我创建了一个扩展“DogKennel”的名为“RetrieverDogKennel”的类,我希望“RetrieverDogKennel”类的“insertDog(...)”方法中的参数只接受“Retriever”对象。虽然它看起来不像“insertDog(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);

【问题讨论】:

    标签: java class generics types abstract


    【解决方案1】:

    更新

    您需要使两个类都通用,而不是子类方法:

    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) 方法,即它可以接受任何类型的狗。

    【讨论】:

    • 非常酷。谢谢你的回答。 “public class Retriever extends Dogness” 我不知道你能做到这一点。我试图支持你,但我的名声不允许。
    • 我在我的问题上犯了一个错误,但我需要对象独立于这些类。
    • 感谢您的更新。很抱歉造成混乱。如果我正确理解了您的代码,那么所有类都需要实现一个通用接口,对吗?
    • @KeepAtIt 如果你不这样做,那么通用的DogKennel 代码怎么能对dog 对象做任何事情,除了例如打电话给toString()?如果“做某事”逻辑不关心对象,它可以处理猫或飞机,那么不,你不需要Dog 接口/基类。
    • “做某事”逻辑本身都是基本的对象逻辑,所以它不需要任何东西,只需要对象本身。但是,我希望扩展抽象类的类上的方法“insertDog(...)”不允许任何其他不属于扩展抽象类的类指定的类型的对象。
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 2017-06-20
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多