2012-02-03 9 views
0

いくつかの制限があるジェネリックコンテナ(たとえば、以下のJavaコード)を作成しようとしています。たとえば、いくつかの制限を超えるアイテムを入れることはできません。問題は、Tが未知の型であるため、整数を持つ比較関数がエラーを報告していることです。この問題を解決するには?ジェネリック/テンプレートタイプのチェック

第2に、コードがC++で書かれていれば解決策はありますか?

public class Box<T> { 
    private T val; 
    private int max; 

    public Box (int m, T initval) { max = m; val = initval; } 

    public T get() { return val; } 
    public void set(T newval) { 
     val = newval; 
     if(newval.toInt() >= max) // error on toInt 
      System.out.printf("ERR: size too big\n"); 
     } 
} 

答えて

2

あなたはいくつかのオブジェクトは単にオーバーライド:()メソッドを持っていない

interface ToIntable { 
    int toInt(); 
} 

public class Box<T extends ToIntable> { 
... 
    if (newval.toInt() >= max) doSomething(); 
... 
} 
+0

C++では、型名 'T'に' int'を受け入れる 'operator> ='(あるいは 'T'と' int'を受け入れる 'operator> ='の特殊化)を持たなければならないと思います。 –

+0

ありがとうございました。 – R71

0

genericsを使用する代わりにインターフェイスを使用できますか?この場合、おそらくコンテナで使用できる型を示すメソッドを持たないマーカーインタフェースにすぎないでしょう。

+0

私は理解できませんでした。コード例を表示できますか? – R71

2

を持つ必要があります。あなたのケースでは、(すべてのクラスが継承する)Objectクラスに含まれるメソッドだけを呼び出すことができます。

使用するオブジェクトのタイプがわかっている場合は、目的のタイプにキャストしてからtoInt()メソッドにアクセスします。しかし、それは汎用コンテナなので、それを制御することはできません。

実行するtoInt()メソッドがあることを確認する別の方法は、ジェネリックがインターフェイスを受け入れるようにすることです。インターフェイスの中でtoInt()を定義すると、そのインターフェイスを実装するすべてのクラスでコンテナを使用できるようになります。

先ほど触れたように、あなたはObjectクラスのメソッドにしかアクセスできません。したがって、簡単に言えば、あなたが記述した方法でオブジェクトのメソッド以外のものを使用する本当に汎用のコンテナを実装することはできません