1

我理解这里发布的解决方案不同的返回类型的java中抽象方法没有强制转换

但是,我认为我不能使用泛型,因为其他一些类包含“内容”,我不想在编译时决定它使用哪种类型的内容。

public abstract class Content {
    public abstract Content getContent();
}

public class UrlContent : Content  {
    public String s;
    public getContent(){ return s;}

}

public class ImageContent : Content  {
    public Byte[] image;
    public getContent(){ return image;}
}
4

2 回答 2

3

您可以使用generics完成此操作,并且仍然维护一个非泛型接口,您可以在不需要知道返回类型的任何地方引用该接口,例如:

public interface IContent {
    object GetContent();
}

public abstract class Content<T> : IContent {
    public abstract T GetContent();
    object IContent.GetContent() 
    {
        return this.GetContent(); // Calls the generic GetContent method.
    }
}

public class UrlContent : Content<String>  {
    public String s;
    public override String GetContent() { return s; }
}

public class ImageContent : Content<Byte[]>  {
    public Byte[] image;
    public override Byte[] GetContent(){ return image; }
}
于 2014-03-03T02:26:09.500 回答
1

假设后来的实现是public override Content getContent()方法......

您已将函数声明为返回 Content 对象,然后尝试从中返回 String 或 Byte[]。这行不通。如果您希望能够返回任意数量的类型,最简单的方法是 returnObject而不是Content,这对于 byte[] 或 string 都可以正常工作。它还可以作为对调用代码的警告,即数据类型几乎可以是任何东西。

您还可以使用您在该链接中引用的泛型,并让不返回特定类型的类定义自己,public class StrangeContent : Content<object>以便它们可以返回多种数据类型,而无需强制所有实现为松散类型。

于 2014-03-03T02:37:39.090 回答