我理解此处发布的解决方案Different return types of abstract method in java without casting
但是,我不认为我可以使用泛型,因为其他一些类包含“内容”,我不想在编译时决定它使用哪种类型的内容。
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;}
}
答案 0 :(得分: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; }
}
答案 1 :(得分:1)
假设后面的实现意味着public override Content getContent()
方法......
您已将函数声明为返回Content对象,然后尝试从中返回String或Byte []。这不行。如果您希望能够返回任意数量的类型,最简单的方法是返回Object
而不是Content
,这对于byte []或string可以正常工作。它还可以作为对调用代码的警告,数据类型可以是任何内容。
您也可以使用您在该链接中引用的泛型,并让不返回特定类型的类将自己定义为public class StrangeContent : Content<object>
,这样它们就可以返回多种数据类型而不必强制所有实现松散的打字。