ジェネリックと継承を適切に混合して、望ましい結果を得るにはどうすればよいですか?

アンドレイ:

私の質問は言葉で説明するのは簡単ではありませんが、幸いなことにそれを示すことはそれほど難しくありません。だから、私と一緒に耐えてください:

public interface Command<R>
{
    public R execute();//parameter R is the type of object that will be returned as the result of the execution of this command
}

public abstract class BasicCommand<R> implements Command<R>
{
}

public interface CommandProcessor<C extends Command<?>>
{
    public <R> R process(C<R> command);//this is my question... it's illegal to do, but you understand the idea behind it, right?
}

//constrain BasicCommandProcessor to commands that subclass BasicCommand
public class BasicCommandProcessor<C extends BasicCommand<?>> implements CommandProcessor<C>
{
    //here, only subclasses of BasicCommand should be allowed as arguments but these
    //BasicCommand object should be parameterized by R, like so: BasicCommand<R>
    //so the method signature should really be 
    //    public <R> R process(BasicCommand<R> command)
    //which would break the inheritance if the interface's method signature was instead:
    //    public <R> R process(Command<R> command);
    //I really hope this fully illustrates my conundrum
    public <R> R process(C<R> command)
    {
        return command.execute();
    }
}

public class CommandContext
{
    public static void main(String... args)
    {
        BasicCommandProcessor<BasicCommand<?>> bcp = new BasicCommandProcessor<BasicCommand<?>>();
        String textResult = bcp.execute(new BasicCommand<String>()
        {
            public String execute()
            {
                return "result";
            }
        });
        Long numericResult = bcp.execute(new BasicCommand<Long>()
        {
            public Long execute()
            {
                return 123L;
            }
        });
    }
}

基本的に、私は、一般的な「プロセス」メソッドがCommandオブジェクトの一般的なパラメーターのタイプを指示することを望みます。目標は、CommandProcessorの異なる実装を、Commandインターフェースを実装する特定のクラスに制限できると同時に、CommandProcessorインターフェースを実装する任意のクラスのプロセスメソッドを呼び出して、指定されたタイプのオブジェクトを返せるようにすることです。パラメータ化されたCommandオブジェクト。私の説明が十分に明確かどうかはわかりませんので、さらに説明が必要な場合はお知らせください。たぶん、問題は「これで実現できるだろうか?」答えが「いいえ」の場合、最善の回避策は何ですか(私は自分でカップルを考えましたが、いくつかの新鮮なアイデアが欲しいです)

mdma:

残念ながら、これはできません。あなたがしたいので、CommandProcessorインターフェースはで定義されるようにCommand、あなたのimplemnetationは、あらゆる種類の取るために準備しなければならないCommandのインスタンスを-ジェネリックは、これを制限することはできませんBasicCommand、それは、その後、できれば- BasicCommandProcessorサブクラスが実装しないとCommandProcessorのインターフェイスを。

または、別の角度から見ると、CommandProcessorインターフェースが与えられているため、ジェネリックスがBasicCommandインスタンスでのみ呼び出されるようにすることはできませんこれを行うには、難しさを知る必要があり、多態性とインターフェースのポイントに反することになります。

コマンドの結果はパラメーター化できますが、コマンドの具体的なクラスはパラメーター化できません。

public interface Command<R>
{
    public R execute();//parameter R is the type of object that will be returned as the result of the execution of this command
}

public abstract class BasicCommand<R> implements Command<R>
{
}

public interface CommandProcessor
{
    public <R> R process(Command<R> command);
}

public class BasicCommandProcessor implements CommandProcessor
{
    public <R> R processBasicCommand(BasicCommand<R> command)
    {
       return command.execute();
    }

    public <R> R process(Command<R> command)
    {
       return processBasicCommand((BasicCommand<R>)command);
    }
}

最も簡単な方法は、必要な特定の型を受け入れるメソッドを提供し、それをジェネリックメソッドで呼び出すことです。(上記のBasicCommandProcessorを参照してください。)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Swiftの新しい結果型でジェネリック型を適切に使用するにはどうすればよいですか?

分類Dev

結果の型の文字列値としてジェネリックのクラス名を使用するにはどうすればよいですか

分類Dev

継承の望ましい結果を得るには?

分類Dev

Doctrine2単一テーブル継承リポジトリから混合オブジェクトタイプの結果セットを取得するにはどうすればよいですか?

分類Dev

JSONオブジェクトを再帰的に解析した後、その結果を適切に表示するにはどうすればよいですか?

分類Dev

RealmDB結果オブジェクトをSwiftUIリストに適切にマッピングするにはどうすればよいですか?

分類Dev

ジェネリック型から継承するリポジトリを普遍的に作成するにはどうすればよいですか?

分類Dev

ジェネリックではない子を介して親クラスからジェネリックメソッドに適切にアクセスするにはどうすればよいですか?

分類Dev

ElasticSeachクエリを正確にして、結果をより適切に区別するにはどうすればよいですか?

分類Dev

継承または別のアプローチを使用してPOJOを適切に構成するにはどうすればよいですか?

分類Dev

JavaScriptを評価してXamariniOSプロジェクトで結果を得るにはどうすればよいですか?

分類Dev

QT Creatorで継承されたクラスのオブジェクトとしてQWidgetを宣言するにはどうすればよいですか?

分類Dev

異なるシートからルックアップ値を取得して適切な結果を表示するにはどうすればよいですか?

分類Dev

Javascriptでの継承。オブジェクトでメソッドを継承しますか?どうすれば結果に到達できますか?

分類Dev

タイプがワイルドカードの場合、ジェネリック結果をジェネリックパラメーターとして使用するにはどうすればよいですか?

分類Dev

変数をプライベートとして保持し、それでも望ましい出力を得るにはどうすればよいですか?

分類Dev

Cloud Firestoreからオブジェクトとしてクエリの結果を取得するにはどうすればよいですか?

分類Dev

内部クラスに包含クラスのジェネリック型を継承させるにはどうすればよいですか?

分類Dev

クローン作成方法を適切に継承するにはどうすればよいですか?

分類Dev

PDOでクエリ結果を配列として取得するにはどうすればよいですか?

分類Dev

SQLクエリ結果をEntityFrameworkのオブジェクトとして使用するにはどうすればよいですか?

分類Dev

クラスを開いてActiveRecordオブジェクトに変換するにはどうすればよいですか?(たとえば、ActiveRecord :: Baseを継承するようにします)

分類Dev

nhibernateが継承されたオブジェクトからの結果を結合しないようにするにはどうすればよいですか?

分類Dev

ランダムな色(javascript)を生成し、ボタンがクリックされたときにその結果をボタンに適用しようとしています。JSをJqueryに組み込むにはどうすればよいですか?

分類Dev

PowerShellのオブジェクトをjsonにシリアル化し、PSデスクトップとコアで同じ結果を得るにはどうすればよいですか?

分類Dev

インターフェイスをジェネリックとして使用して変数を宣言するにはどうすればよいですか

分類Dev

gitリポジトリ内のすべてのJavaプロジェクトが最新または望ましいバージョンのmaven依存関係を持っていることを確認するにはどうすればよいですか?

分類Dev

JavaScriptで既存のオブジェクトを継承する新しいオブジェクトを作成するにはどうすればよいですか?

分類Dev

C#ジェネリック型から非ジェネリック型に継承するときに冗長性を減らすにはどうすればよいですか?

Related 関連記事

  1. 1

    Swiftの新しい結果型でジェネリック型を適切に使用するにはどうすればよいですか?

  2. 2

    結果の型の文字列値としてジェネリックのクラス名を使用するにはどうすればよいですか

  3. 3

    継承の望ましい結果を得るには?

  4. 4

    Doctrine2単一テーブル継承リポジトリから混合オブジェクトタイプの結果セットを取得するにはどうすればよいですか?

  5. 5

    JSONオブジェクトを再帰的に解析した後、その結果を適切に表示するにはどうすればよいですか?

  6. 6

    RealmDB結果オブジェクトをSwiftUIリストに適切にマッピングするにはどうすればよいですか?

  7. 7

    ジェネリック型から継承するリポジトリを普遍的に作成するにはどうすればよいですか?

  8. 8

    ジェネリックではない子を介して親クラスからジェネリックメソッドに適切にアクセスするにはどうすればよいですか?

  9. 9

    ElasticSeachクエリを正確にして、結果をより適切に区別するにはどうすればよいですか?

  10. 10

    継承または別のアプローチを使用してPOJOを適切に構成するにはどうすればよいですか?

  11. 11

    JavaScriptを評価してXamariniOSプロジェクトで結果を得るにはどうすればよいですか?

  12. 12

    QT Creatorで継承されたクラスのオブジェクトとしてQWidgetを宣言するにはどうすればよいですか?

  13. 13

    異なるシートからルックアップ値を取得して適切な結果を表示するにはどうすればよいですか?

  14. 14

    Javascriptでの継承。オブジェクトでメソッドを継承しますか?どうすれば結果に到達できますか?

  15. 15

    タイプがワイルドカードの場合、ジェネリック結果をジェネリックパラメーターとして使用するにはどうすればよいですか?

  16. 16

    変数をプライベートとして保持し、それでも望ましい出力を得るにはどうすればよいですか?

  17. 17

    Cloud Firestoreからオブジェクトとしてクエリの結果を取得するにはどうすればよいですか?

  18. 18

    内部クラスに包含クラスのジェネリック型を継承させるにはどうすればよいですか?

  19. 19

    クローン作成方法を適切に継承するにはどうすればよいですか?

  20. 20

    PDOでクエリ結果を配列として取得するにはどうすればよいですか?

  21. 21

    SQLクエリ結果をEntityFrameworkのオブジェクトとして使用するにはどうすればよいですか?

  22. 22

    クラスを開いてActiveRecordオブジェクトに変換するにはどうすればよいですか?(たとえば、ActiveRecord :: Baseを継承するようにします)

  23. 23

    nhibernateが継承されたオブジェクトからの結果を結合しないようにするにはどうすればよいですか?

  24. 24

    ランダムな色(javascript)を生成し、ボタンがクリックされたときにその結果をボタンに適用しようとしています。JSをJqueryに組み込むにはどうすればよいですか?

  25. 25

    PowerShellのオブジェクトをjsonにシリアル化し、PSデスクトップとコアで同じ結果を得るにはどうすればよいですか?

  26. 26

    インターフェイスをジェネリックとして使用して変数を宣言するにはどうすればよいですか

  27. 27

    gitリポジトリ内のすべてのJavaプロジェクトが最新または望ましいバージョンのmaven依存関係を持っていることを確認するにはどうすればよいですか?

  28. 28

    JavaScriptで既存のオブジェクトを継承する新しいオブジェクトを作成するにはどうすればよいですか?

  29. 29

    C#ジェネリック型から非ジェネリック型に継承するときに冗長性を減らすにはどうすればよいですか?

ホットタグ

アーカイブ