2013-05-07 2 views
0

Я хочу генерировать случайные числа id в родовом классе. Пользователь должен иметь возможность выбирать из большинства реализаций номера. Является ли мой подход безопасным в случае литья с длинного на байт? Я не знаю, что происходит на таком унынии. Какое число это приведет? Будут ли найдены равномерно распределенные номера?Генерация случайных чисел в родовом классе

@SuppressWarnings("unchecked")  
public class Test<I extends Number> 
    { 
     SecureRandom random = new SecureRandom(); 
     I id = (I) random.nextLong(); 
     while(Test.has(id)) 
     { 
      id = (I) random.nextLong(); 
     } 
    } 
+0

Я уверен, что вы собираетесь получить исключаем исключения здесь. Что, если 'I' был какой-то пользовательский класс, который вы сделали? Во что бы то ни стало подумал, вы должны попробовать это для себя. –

+0

Могу ли я спросить, в чем цель этого класса? –

+0

Согласен с назначением w/r/t .... Генератор случайных чисел, который создает экземпляры Number, а не примитивы, будет намного медленнее. – rolfl

ответ

1

Java-Number класс не предназначен для этого вида использования общего класса. Вы не можете бросать, как вы пытаетесь сделать; нет способа (особенно после type erasure), что Java может знать, чего вы пытаетесь достичь. Например, нет автоматического бокса, если I - AtomicInteger, BigDecimal и т. Д. (Не то, что кастинг - это способ, чтобы вызвать авто-бокс в первую очередь).

Я предлагаю вам перепроектировать ваше приложение, чтобы оно не полагалось на такого зверя, как ваш предлагаемый класс. Это просто не сработает.

+0

Листинг работает до тех пор, пока случайный длинный находится в пределах ожидаемого диапазона значений, например, байт и т. д. Но если бы у меня просто был цикл для действительного броска, я боюсь за очень дорогостоящий поиск идентификатора при кастинге Long to Byte. –

+0

@JamieFlowers - вы можете использовать 'HashSet' для хранения ваших ключей. Стоимость поиска будет практически одинаковой (и довольно низкой), если вы храните ключи «Byte» или «Long». –

Смежные вопросы