0

私は楽しいひねりを加えたようです。次のような状況があります。

public class Parameter<T> {
   public Parameter(String value, Verifier<T> verif){
       //stuff, lots of stuff!
   }
}

public interface Verifier<T>{
   //definition
}

public enum StringVerif implements Verifiier<String>{
    INSTANCE;
    //some static functions on my singleton
}

public abstract class ParamFactory{
    private static ArrayDeque<Verifier<?>> verifList...
    ...
    for(Verifier<?> ver : verifList){
        if(ver.isapplicable(someData){
            //now I'm stuck!
        }
    }
}

つまり、テストに合格した Verifier の型に基づいて、適切な型付きパラメーターを作成する必要があります。たとえば、検証者の場合はパラメーターを作成できる必要があり、検証者の場合はパラメーターを作成できる必要があります。これらのパラメータは、別のコレクションに送信されます。本質的には、必要に応じてさまざまな型パラメーターを解析できる検証モジュールとプロセッサ モジュールを備えた拡張可能なファクトリであり、非常に強力です。問題は、リフレクションによってジェネリック型を取得するだけでなく、この型からジェネリック型を作成する必要があることです。

これをどこから始めるべきかについてのアイデアはありますか? これをジェネリックと深く扱ってから長い時間が経ちました

4

2 に答える 2

0

sに関する私の以前のコメントを拡張しますHList:(これはコメントには大きすぎたので、回答として投稿します。)

コード例にはScalaを使用しています。これは、議論されているアイデアを適切にサポートしているためです。すべてのコード例はコンソールで入力されます。

タイプのDogオブジェクトとタイプの別のオブジェクトがあるTiger場合、それらを同じ共変リストに入れると、結果のリストのタイプList[Animal]Animal共通のスーパータイプになります。このリストは同種であるため、元のタイプは失われます。以下の推定タイプのリストに注意してください。

scala> class Animal
defined class Animal

scala> class Dog extends Animal
defined class Dog

scala> class Tiger extends Animal
defined class Tiger

scala> List(new Tiger, new Dog)
res0: List[Animal] = List(Tiger@a32604, Dog@1150b68)

同様Verifier[Int]Verifier[String]、単一の同種リストに入れると、タイプはと見なされVerifier[Any]ます。(Scalaでは、Anyクラスはオブジェクト階層の最上位にあります。)参照:

scala> class Verifier[+T](value: T) {
     |   override def toString = "Verifier(" + value.toString + ")"
     | }
defined class Verifier

scala> List(new Verifier(6), new Verifier("hello"))
res1: List[Verifier[Any]] = List(Verifier(6), Verifier(hello))

静的型を保持し、後でそれらを計算に使用する場合は、異種リストを使用する必要があります。またはHList略して。

scala> new Verifier(6) :: new Verifier("hello") :: HNil
res2: shapeless.::[Verifier[Int],shapeless.::[Verifier[java.lang.String],shapeless.HNil]] = Verifier(6) :: Verifier(hello) :: HNil

ポリモーフィックマッピングがどのように機能するかを次に示します。

scala> class Parameter[+T](value: String, verif: Verifier[T]) {
     |   override def toString = "P(" + value + ", " + verif + ")"
     | }
defined class Parameter

scala> object mapper extends (Verifier ~> Parameter) {
     |   def apply[A](v: Verifier[A]): Parameter[A] = new Parameter("k", v)
     | }
defined module mapper

scala> res2 map mapper
res3: mapper.Out = P(k, Verifier(6)) :: P(k, Verifier(hello)) :: HNil

タイプパラメータを保持し、指定された上位の関数を使用してリストの各要素に作用しました。HListこれによりParameter、正しいタイプが保持されたsが返されました。

の概念はHListJavaで実装できますが、構造体に対して多くの有用な操作を定義できないことに注意してください。Javaの型システムはそれができません。興味のある方は、このトピックに関するすばらしい記事をご覧ください。

これが何らかの形で役立つことを願っています。

于 2012-06-26T06:15:30.193 に答える
0

私はこれに間違ってアプローチしていたことが判明しました。正しい手法は、各検証者がコンストラクターの呼び出しを担当することでした。各検証者は既に独自の型を知っているため、数行で済みます。これらのベリファイアが本当にファクトリのコンポーネントであると考えない限り、ファクトリの概念をいくらか壊します。

public interface Verifier<T>{
   //definition
   public Err buildParaList(String value, Single<Parameter<?>> output);
}

public enum StringVerif implements Verifiier<String>{
    INSTANCE;
    //some static functions on my singleton
    @Override
    public Err buildParaList(String value, Single<Parameter<?>> output){
        output.elem = new Parameter<String>(value, INSTANCE);
        return Err.success();
    }
}
public abstract class ParamFactory{
    private static ArrayDeque<Verifier<?>> verifList...
    ...
    for(Verifier<?> ver : verifList){
        if(ver.isapplicable(someData){
            Single<Parameter<?>> param = new Single<Parameter<?>>();
            Err e = ver.buildParameter(value, param);
            //checks
            paramList.add(param.elem);
        }
    }
}

私の実際の使用法は例よりも複雑ですが、それでも機能します。私は本当に前にこれを考えていたはずです.昨夜はそれほど警戒していなかったと思います. ご支援ありがとうございます。

于 2012-06-26T04:27:25.817 に答える