2013-02-28 12 views
5

Zastanawiam się, czy ktoś mógłby mi pomóc w zapewnieniu opcji precyzji podwójnej i zmiennoprzecinkowej klasy?Specjalizuję się w klasie java dla precyzji podwójnej i pływającej

Pracuję z Java3D i ze specyfikacją API dla Point3d i Point3f. Rozumiem, że implementacja skutecznie powiela klasę Point3f, zastępując zmiennoprzecinkowe w razie potrzeby podwójnym. Czy to dlatego, że Generics nie może być używane z prymitywnymi typami danych? Wydajność?

Piszę klasy Curve i zastanawiam się powinienem zapewnić Curved i Curvef w podobny sposób. Czy to najlepsza opcja?

+1

Zobacz http://stackoverflow.com/questions/2721546/why-dont-generics-support-primitive-types dla pokrewnych informacji. – djechlin

+1

Pisz tylko jedno, jeśli użyjesz obu. –

+1

Należy również zauważyć, że jest to wyraźnie przedwczesna optymalizacja. Po prostu użyj podwójnie. – djechlin

Odpowiedz

5

Tak, niestety generics Java nie działa na typach pierwotnych.

Można jednak generować kod, tworząc wiele plików Java z jednego szablonu.

Java 8 wprowadzi wiele specjalistycznych prymitywnych wersji funkcjonalnych interfejsów, takich jak IntFunction. To będzie dość brzydkie.

+0

Dzięki za pomoc. Bardzo doceniane. – felice

1

Myślę, że głównym problemem jest wydajność. Parametry typu ogólnego muszą być podtypem Object, wtedy implementacja ogólna powinna używać wrapperów Double i Float (ponieważ typy pierwotne nie są dostępne dla mechanizmu generycznego).

W tym przypadku każde wystąpienie Curve utworzy kilka obiektów, po jednym dla każdej wartości podwójnej/zmiennoprzecinkowej. Rzeczywista wartość zostanie odczytana za pomocą wywołań metod, takich jak doubleValue() i floatValue(). Ponadto, ponieważ prymitywne opakowania są niezmienne, wynik jakiejkolwiek operacji z owijkami musi być przechowywany w nowej instancji. Wydaje się to nie do przyjęcia, ponieważ w ciężkich obliczeniach prawdopodobnie zostanie użyte Curve.

+0

Dzięki za to. Jak sugerujesz, Curve będzie musiał wykonać wiele obliczeń. – felice