2010-11-18 10 views
3

タイトル: -/非汎用クラスを汎用階層に統合する方法は?

電卓用のパーサを作成しました。それは動作しますが、私は自分のトークン階層が嫌いです。パーサーは、具体的な数値型を知らないでください。私は、一般的なトークンのインターフェースに持っているので、ダブル、BigDecimalのなどのために、設定する必要があります

public interface Token<T> { } 

public class NumToken<T> { 
    private final value T; 
    ... 
} 

public class OperatorToken<T> { 
    ... 
} 

今、私の質問には関係なく、数値型、例えば同じです「構造」トークンを処理する方法でありますカッコとセパレータ。その場合、ジェネリックパラメータは役に立たないだけでなく、そのタイプの列挙型を使用できなくなります。しかし、列挙型は非常に便利です。 switchステートメントで使用できます。これは動作しますが、List<Token<? super T>>のようなパーサの事をintどこにでも書くこと、および他のすべてのタイプが実際にToken<T>ときであることを前提とするために私を強制的に

public enum CharToken implements Token<Object> { 

    OPEN('('), 
    CLOSE(')'), 
    SEPARATOR(','), 
    EOL(';'); 

    private final char ch; 

    private CharToken(char ch) { 
     this.ch = ch; 
    } 
} 

は今、私は道の問題を「解決」しています私はキャストします。私は明らかに型システムを穀粒に対して使用しています。型理論的な観点からは、JavaにはScalaの "Nothing"のような "ボトム"型がないため、壁に当たっています。より良い解決策はありますか?

[明確化]

Tは予想数が私のパーサはトークンの「コンテンツ」、ではないに動作するはずタイプです。例えば。 OperatorToken<T>の場合calc(T op1, T op1)の方法があります。そして、パーサ全体をTでパラメータ化できるようにしたいので、それによって使用されるすべてのトークンが同じTを必要とします(superで不正行為をしていない場合)CharToken implements Token<Character>はあまり役に立ちません。

+0

これは 'implementsトークンではいけません。' – Bozho

+0

'トークン'では何をしますか? – khachik

答えて

1

(例えばjava.util.Collections.emptyList()中)JDKに用いられる溶液は、消去を悪用された - あなたが思い出すかもしれないようなタイプのパラメータはは本当に、存在しません - とメソッドの型パラメータ推論:

@SuppressWarnings("unchecked") 
public enum CharToken implements Token { // Note: No type parameter specified! 

    OPEN('('), 
    CLOSE(')'), 
    SEPARATOR(','), 
    EOL(';'); 

    public static <T> Token<T> open(){ return OPEN; } 
    public static <T> Token<T> close(){ return CLOSE; } 
    public static <T> Token<T> separator(){ return SEPARATOR; } 
    public static <T> Token<T> eol(){ return EOL; } 

    private final char ch; 

    private CharToken(char ch) { 
     this.ch = ch; 
    } 
} 

// Usage: 
Token<BigDecimal> bdOpen = CharToken.open(); 
Token<Integer> intOpen = CharToken.open(); 

ありません非常にかわいいですが、少なくとも使いやすいです。 (そして、清潔さのために、ジェネリックメソッドだけを公開するクラスにenumをカプセル化したいかもしれません)。

+0

ありがとうございます。私はそんなやり方をしたし、それはかなりうまくいく。それにもかかわらず、それは不正行為のように感じる... – Landei

0

同様の目的で考案されたJavaではVoidタイプがあります。しかし、IMOの型パラメータは、Bozhoが示唆するように、むしろCharacterであるべきです。

関連する問題