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[] を返そうとしました。これはうまくいきません。任意の数の型を返すことができるようにしたい場合、最も簡単な方法は のObject代わりに返すことですContent。これは byte[] または string に対してうまく機能します。また、データ型がほぼ何でもよいという呼び出しコードへの警告としても機能します。

また、そのリンクで参照したようなジェネリックを使用し、特定の型を返さないクラスを独自に定義してpublic class StrangeContent : Content<object>、すべての実装を緩く型付けすることなく複数のデータ型を返すことができるようにすることもできます。

于 2014-03-03T02:37:39.090 に答える