2013-03-31 8 views
9

2,9. * Projemi 2.10 güncelleştiriyorum. Değer türleri için mükemmel adaylar gibi görünen temel türleri (açıları, uzunlukları, vb.) Için birkaç dersim var. Ne yazık ki, bu türleri kullanan Java kodum derlenmiyor ve nedenini anlayamıyorum. Bunu çok basit bir kod setine göre basitleştirdim. Herhangi bir öneri çok takdir edilecektir.Scala Kullanarak 2.10.1 Java'da Değer Türleri

Açı sınıf tanımı ben derleme yaparken, bu hatayı olsun (skalası) (acı Java ile yazılmış)

package com.example.units 

class Angle(val radians : Double) extends AnyVal 
{ 
    def degrees = radians * 180.0/math.Pi 
} 

object Angle 
{ 
    val Zero = new Angle(0) 
} 

Açı Testi Vaka

package com.example.units; 

import junit.framework.Assert; 
import org.junit.Test; 

public class AngleTest 
{ 
    @Test 
    public static void TestZero() 
    { 
     Angle a = Angle.Zero(); 
     Assert.assertEquals(a.degrees(), 0, 1E-9); 

    } 

} 

:

AngleTest.java:19 incompatible types 
found :double 
required: com.example.units.Angle 
Angle a = Angle.Zero(); 

      ^

Angle.Zero'nun bir açı değil, bir çift olarak geri döndüğü gibi. Kutu/kutulama yöntemleri eklemeyi denedim, ancak aynı hatayı almaya devam ettim. Yine, herhangi bir yardım büyük takdir edilecektir.

cevap

10

Scala derleyici, değer sınıflarını çalışma zamanları için maliyetlerini ortadan kaldıran kutulanmamış türlerine dönüştürür. Angle için derlenmiş sınıf dosyasını araştırırken, aşağıdaki görürsünüz: Yani bakış Java'nın noktasından

public static double Zero(); 

, Angle.Zero çift döndürür; Scala'nın değer sınıflarının anlambiliminden haberdar değil. İkincisi hala olabilir demektir

public static double degrees$extension(double); 
public double degrees(); 

: Böyle degrees olarak

Angle'ın kendi yöntemleri, double kutulanmamış değere (alır a) statik uzantısı yöntemi) b) bir örnek yöntemi içinde derlenmiş olsun

+0

Örneğindeki yanıt için teşekkürler. Okunabilirlik sınıflarımda (Angle.fromDegrees(), Angle.fromRadians(), vb.) Okunabilirliği geliştirmek için fabrika yöntemlerini oldukça kullanıyorum. Şu anda bu yöntemlerin tümü, yukarıda ana hatlarıyla belirtilen aynı soruna sahiptir. Bana göre bu işi yapmanın bir yolu olmalı. – fbl

+1

Çalışması için bir yol görmeyi kesinlikle merak ediyorum. Birkaç geçici çözümü denedikten sonra, hiçbir şey zarif görünmüyor (örneğin, Java testlerinizde .Zero() çağrısından aldığınız değeri bir Açı'da sarabilirsiniz, ancak bu da okunabilirliği azaltır). Bence buradaki temel neden, Scala'nın sınıf sınıflarının, normal sınıflar olarak Java ile aynı birlikte çalışabilirlik için tasarlanmamış olmasıdır; Scala kodunuzu basitleştirmek için sadece bir derleme zamanı soyutlamasıdır. Davanızda düzenli sınıfları kullanmanızı öneriyorum. –

+0

Maalesef aynı sonuca vardım. Bu bir hata değilse, o zaman en azından tasarım kusuru w/değer türleridir. Scalas'ın güçlü yönlerinden biri, doğal olarak w/Java koduyla birlikte çalışma yeteneğidir. Sıkılıncaya kadar bunları kullanmaktan kaçınıyorum. – fbl