JDK1.5 - Painful bugs: Solved JDK1.5 - Горькая ошибки: Решенные
Update: The defects have been solved in the latest release of 1.5 Обновление: Эти дефекты были решены в последней версии в размере 1,5
I wanted to create a simple max function, something I wanted to do for quite sometime, which takes a variable number of Number & Comparable arguments, essetially Integer, Double etc., and returns the max of the same type. Я хотел бы создать более простую функцию, то, что я хотел сделать в течение довольно-нибудь, который принимает различное количество Количество и сравнимые аргументы, essetially Integer, Двухместный т.д., а возвращает не более одного и того же типа. Also I would like to use auto-boxing to enable me to pass int & floats. Также я хотел бы воспользоваться авто-бокс, чтобы мне пройти int и плавает. With generics, varargs, auto-boxing available, I thought I was all set until I tried. Что генерические, varargs, авто-бокса имеются, я думал, я был весь набор до тех пор, пока я старался. I realized the dream is there but JDK 1.5 is still far from realizing the vision. Я понял, мечта есть 1,5 JDK, но все еще далека от реализации видения.
The code shows an implementation which should, but doesn’t compile with jdk1.5. Код показывает, осуществление которых должно, но не компилируется с jdk1.5.
To compile use javac -source 1.5 MathUtil.java Чтобы собрать использовании javac-источник 1,5 MathUtil.java
It also shows a commented implementation (dumbed down version) which compiles. Она также показывает, прокомментировал реализации (dumbed вниз версия), которая собирает. However it doesn’t allow me to realize the benefits of varargs in this case. Вместе с тем она не позволяет мне реализовать выгоды varargs в данном случае.
Also note that the errors messages are ambiguous (what an ambiguous spelling!). Имейте также в виду, что ошибки сообщения неоднозначны (что двусмысленный правописания). For example the first errors says: generic array creation Например первой ошибки, говорит: общий массив создания
Sure I can create a generic array if I use: T [] args, as shown in the commented code. Конечно я могу создать общий массив, если я использую: T [] args, как видно из комментариев кода.
The other two errors messages are ambiguous too. Две другие ошибки сообщения слишком двусмысленным.
Here is the sample code with comments: Вот пример кода с комментариями:
/** This class demonstrate few limitations in jdk implementation. / ** Этот класс продемонстрировать несколько ограничений в JDK, осуществления. The objective is * to implement a generic max function which takes any number of Number values and returns * the max. * Цель заключается в реализации общих макс функция, которая принимает любое количество Количество значений и возвращает * макс. It allows variable arguments so you can say max(1, 2, 3). Она позволяет переменная аргументы, чтобы можно было сказать, Макс (1, 2, 3). It supports * autoboxing so you can use 1 instead of Integer.valueOf(1). Он поддерживает * autoboxing так что вы можете использовать 1 вместо Integer.valueOf (1). And it returns the * data of the same type as passes parameter, so type casting is not required, * using generics capability. И это возвращает * данные из одного типа в качестве пропуска параметра, тем типа литья не требуется, * с использованием непатентованных потенциал. * * This class doesn't compile. * * Этот класс не собрать. Errors are shown below. Ошибки показаны ниже. * * * ** MathUtil.java:16: generic array creation * public static * MathUtil.java: 16: общий массив * создание общественных статическиеT max(T … args) { * ^ * MathUtil.java:34: Макс T (T… args) (^ * * MathUtil.java: 34: max(T[]) in MathUtil cannot be applied to (int,int,int,int) * ; no instance(s) of type variable(s) T exist so that argument type int conforms * to formal parameter type T[] * assert max(10, 2, 3, 5).compareTo(10) == 0;; * ^ * MathUtil.java:35: Макс (T []) в MathUtil не может быть применен к (int, int, int, int) *; нет инстанции (ы) тип переменной (ов) Т существовать так, что аргумент типа int * соответствует официальному параметр типа T [] * Утверждают, Макс (10, 2, 3, 5). CompareTo (10) == 0;; * ^ * MathUtil.java: 35: max(T[]) in MathUtil cannot be applied to (double,double,do * uble,double); no instance(s) of type variable(s) T exist so that argument type d * ouble conforms to formal parameter type T[] * assert max(10.0, 2.0, 3.2, 5.0).compareTo(10.0) == 0;; * ^ * 3 errors * Макс (T []) в MathUtil не может быть применен к (двухместные номера, двухместные номера, делать * uble дважды), нет инстанции (ы) тип переменной (ов) Т существовать так, что аргумент типа д * ouble соответствует формального параметра типа T [] * Утверждают, Макс (10,0, 2,0, 3,2, 5,0). CompareTo (10,0) == 0;; * ^ * 3 * ошибки */ * /
public class MathUtil { общественного класса MathUtil (
/* This alternative dumbed down implementation works / * Эта альтернатива dumbed вниз выполнения работ
public static государственного статическогоT max(T args[]) { Макс T (T args []) (
assert args.length > 1; утверждать args.length> 1;
T max = args[0]; T макс = args [0];
for(T arg:args) { для (T аргумент: args) (
if(max.compareTo(arg) < 0) { если (max.compareTo (аргумент) <0) (
max = arg; макс = аргумент;
} )
} )
return max; вернуться макс;
} )
*/ * /public static государственного статического
T max(T … args) { Макс T (T… args) (
assert args.length > 1; утверждать args.length> 1;
T max = args[0]; T макс = args [0];
for(T arg:args) { для (T аргумент: args) (
if(max.compareTo(arg) < 0) { если (max.compareTo (аргумент) <0) (
max = arg; макс = аргумент;
} )
} )
return max; вернуться макс;
} )public static void main(String … args) { государственной статической силы основных (String args…) (
/* This alternative dumbed down implementation works / * Эта альтернатива dumbed вниз выполнения работ
assert max(new Integer[] {10, 2, 3, 5}).intValue() == 10; утверждают, Макс (новый Integer [] (10, 2, 3, 5)). intValue () == 10;
assert max(new Double[] {10.0, 2.0, 3.2, 5.0}).doubleValue() == 10.0; утверждают, Макс (новый двухместный [] (10,0, 2,0, 3,2, 5,0)). doubleValue () == 10,0;
*/ * /assert max(10, 2, 3, 5).compareTo(10) == 0; утверждают, Макс (10, 2, 3, 5). compareTo (10) == 0;
assert max(10.0, 2.0, 3.2, 5.0).compareTo(10.0) == 0; утверждают, Макс (10,0, 2,0, 3,2, 5,0). compareTo (10,0) == 0;
} )
} )
See more on Смотри на bugs in jdk1.5 ошибки в jdk1.5 in my next post. в моем следующем посту.
Filed under Поданного в соответствии с Java Software Программное обеспечение Java | |
| |
RSS 2.0 RSS 2,0 | |
Email this Article Отослать Статья
You may also like to read Вы можете также люблю читать |





October 17th, 2006 at 7:43 am 17 октября 2006 года в 7:43 утра
j aimerai approfondir mes connaissances en java к aimerai approfondir месяц connaissances в java