Başlık için özür dilerim: -/Genel olmayan sınıflar genel bir hiyerarşide nasıl entegre edilir?
Hesap makinesi için ayrıştırıcı yazdım. İşe yarıyor ama belirteç hiyerarşisini sevmiyorum. Ayrıştırıcı, beton numara türünün, örn. Ben genel bir belirteç arayüzüne sahip Böylece Çift, BigDecimal vb yapılandırılabilir olmalıdır
public interface Token<T> { }
public class NumToken<T> {
private final value T;
...
}
public class OperatorToken<T> {
...
}
Şimdi benim sorum olursa olsun sayı tipi, örn aynı olan "yapısal" Simgelerinizi nasıl kontrol edileceğidir parantez ve ayırıcılar. Genel parametre yalnızca bu durumda işe yaramaz, bu tür için bir enum kullanmamı engeller. Bununla birlikte, bir enum, örn. Anahtar ifadelerinde kullanılabilir.
Şu anda bu şekilde sorunu "çözüldü" var: Bu işler
public enum CharToken implements Token<Object> {
OPEN('('),
CLOSE(')'),
SEPARATOR(','),
EOL(';');
private final char ch;
private CharToken(char ch) {
this.ch = ch;
}
}
, ama bana List<Token<? super T>>
gibi ayrıştırıcı şeyler int her yerde yazmak için, ve diğer tüm türleri aslında Token<T>
zaman olduğunu kabul zorlar Ben atıyorum. Ben buradaki tahılıma karşı tip sistemini açıkça kullanıyorum: Teorik bir bakış açısıyla, duvara vuruyorum çünkü Java'nın Scala'da "Nothing" gibi "dip" tipi olmadığı (ki bu mükemmel bir uyum sağlayacaktı). Daha iyi bir çözüm var mı?
[Açıklama]
T beklenen sayı, benim ayrıştırıcı çalışması gerekir Token'in değil "content" türüdür. Örneğin. OperatorToken<T>
için calc(T op1, T op1)
yöntemim var. Ve tüm ayrıştırıcıyı T tarafından parametrize edebilmek istiyorum, bu yüzden kullandıkları tüm Jetonlar aynı T'ye (iyi, super
ile yaptığım gibi hile yapmazsanız) ihtiyaç duyar ve bu nedenle CharToken implements Token<Character>
çok kullanışlı olmaz.
, "Uygulanamaz" ifadesini kullanmalıdır Token ' –
Bozho
' T' 'Token'de ne yapar? – khachik