タイトル: -/非汎用クラスを汎用階層に統合する方法は?
電卓用のパーサを作成しました。それは動作しますが、私は自分のトークン階層が嫌いです。パーサーは、具体的な数値型を知らないでください。私は、一般的なトークンのインターフェースに持っているので、ダブル、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>
はあまり役に立ちません。
これは 'implementsトークンではいけません。' –
Bozho
'トークン'では何をしますか? – khachik