2017-05-09 21 views
6

Yukarıdaki gibi tanımlanmış bir modelimde bazı durumlarda bir Int. Nasıl Kotlin'e Int için Dönüştürme

var value: Any? 

ben String ilk döküm eğer bunu yapabileceğimi biliyorum ve bu tarihten önce bir Dizesi'ne döküm atlayarak bunu yapmanın bir yolu var mı

value.toString().toInt() // works 

Int için? Bir Int içine doğrudan döküm çalıştığınızda Sana value as Int ile Int bir dize doğrudan döküm girişiminde olduğunu sorundur bu hatayı

FATAL EXCEPTION: main 
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 
+0

"Int'e doğrudan dökmeyi deneyin" ile ne demek istiyorsunuz? Bunun için kodu göremiyorum. Sadece yapmaya çalıştığınız: 'value.toInt()'? Yoksa açık bir oyuncu kadrosuna mı giriyorsunuz: (Tam sayı) değeri? – PseudoPsyche

+1

Örnekte, "değer" olarak adlandırılan "var" bazen bir Int içeren bir Dize içeriyor gibi görünüyor. Bu durumda, ilk önce onu String'e dökmeniz ve daha sonra yaptığınız gibi 'toInt' yöntemiyle onu ayrıştırmanız gerekir. – zsmb13

+0

@PseudoPsyche Int – pablobu

cevap

9

olsun.

Bu, özel durum size söylendiği için, çünkü bir value bir String içerdiğinden ve bir Dize bir Int olarak zorlanamadığı için çalışmaz. Bu String'in bir tamsayıyı temsil etmesi, bir Int'e ayrıştırılması gerektiği için önemli değildir. Bu tam olarak toInt() yönteminin ne yaptığıdır.

İlk olarak bir Dizeye yayınlamanızın nedeni, toInt()'un String üzerinde bir uzantı yöntemidir ve value, Any? türündedir. Bu, toInt()'u doğrudan value numaralı telefondan arayaamayacağınız anlamına gelir, çünkü çalışma zamanında olsa bile derleme zamanında bir Dize içerdiğini bilmez. https://kotlinlang.org/docs/reference/typecasts.html#smart-casts

Bu: Akıllı atmalarını ve burada diğer Kotlin tipi döküm biraz daha fazla bilgi bulabilirsiniz

if (value is String) { 
    value.toInt() 
} 

: Bu adımı atlamak istedi, ayrıca ilk türünü kontrol ederek akıllı yayınları kullanabilirsiniz ayrıca temel tasarım problemine işaret ediyor olabilir. Bu durumun bazen'un bir Int içereceğini beklersiniz, ancak burada gördüğünüz gibi bu değeri modelinizde ayarlayan her şey onu bu sayıyı içeren bir String'e ayarlıyor. Bu değerin gerçekten farklı türler içerebileceğini mi düşünüyorsun yoksa sadece Int ve String mi bekliyorsun? İkincisiyse, daha sonra bu bir Any? yerine bir String yapmak için daha iyi bir tasarım kararı olacaktır. Bu, beklenmedik/işlenmemiş türlerin sağlanmasını engeller ve modele bakarak veya onu kullanan herkese daha az belirsiz olur.

+0

Açıklama için teşekkürler. Değer bir String, bir Int veya başka bir veri türü Benim modelimin bu bölümü için bir revizyon ihtiyacı var. – pablobu

+1

@pablobu Ne yaptığınızı yansıtmak ve akıllı yayınlar önermek için cevabı biraz güncelledim.Çok sayıda veri türünü ele alırsanız Kabul edilen her tip, beklenmeyen bir duruma girmekten kaçınmanın en iyi yolu olacaktır. – PseudoPsyche