diff --git a/CHANGELOG.md b/CHANGELOG.md
index 184ace79..9d51eec5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
* Refactored Permutation.equals() method (non-breaking).
+* Refactored target array allocation in the various SequenceSampler implementations (non-breaking).
### Deprecated
diff --git a/pom.xml b/pom.xml
index c5d9d263..e0f3ffb1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -230,6 +230,9 @@
3.15.0
25
+
+ -Xlint:unchecked
+
diff --git a/src/main/java/org/cicirello/sequences/SequenceInsertionSampler.java b/src/main/java/org/cicirello/sequences/SequenceInsertionSampler.java
index b31ea451..c94052d3 100644
--- a/src/main/java/org/cicirello/sequences/SequenceInsertionSampler.java
+++ b/src/main/java/org/cicirello/sequences/SequenceInsertionSampler.java
@@ -1,6 +1,6 @@
/*
* JavaPermutationTools: A Java library for computation on permutations and sequences
- * Copyright 2005-2023 Vincent A. Cicirello, .
+ * Copyright 2005-2026 Vincent A. Cicirello, .
*
* This file is part of JavaPermutationTools (https://jpt.cicirello.org/).
*
@@ -222,7 +222,8 @@ public char[] nextSample(String source, int k, char[] target) {
@Override
public T[] nextSample(T[] source, int k, T[] target) {
SequenceSamplerUtils.validateK(k, source.length);
- target = SequenceSamplerUtils.allocateIfNecessary(source, k, target);
+ target =
+ SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target);
int[] indexes = r.sampleInsertion(source.length, k, null);
for (int i = 0; i < k; i++) {
target[i] = source[indexes[i]];
@@ -595,7 +596,8 @@ public static float[] sample(float[] source, int k, float[] target, RandomGenera
*/
public static T[] sample(T[] source, int k, T[] target, RandomGenerator r) {
SequenceSamplerUtils.validateK(k, source.length);
- target = SequenceSamplerUtils.allocateIfNecessary(source, k, target);
+ target =
+ SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target);
int[] indexes = RandomSampler.sampleInsertion(source.length, k, null, r);
for (int i = 0; i < k; i++) {
target[i] = source[indexes[i]];
diff --git a/src/main/java/org/cicirello/sequences/SequencePoolSampler.java b/src/main/java/org/cicirello/sequences/SequencePoolSampler.java
index aa9d4853..d84f5768 100644
--- a/src/main/java/org/cicirello/sequences/SequencePoolSampler.java
+++ b/src/main/java/org/cicirello/sequences/SequencePoolSampler.java
@@ -1,6 +1,6 @@
/*
* JavaPermutationTools: A Java library for computation on permutations and sequences
- * Copyright 2005-2023 Vincent A. Cicirello, .
+ * Copyright 2005-2026 Vincent A. Cicirello, .
*
* This file is part of JavaPermutationTools (https://jpt.cicirello.org/).
*
@@ -247,7 +247,8 @@ public char[] nextSample(String source, int k, char[] target) {
@Override
public T[] nextSample(T[] source, int k, T[] target) {
SequenceSamplerUtils.validateK(k, source.length);
- target = SequenceSamplerUtils.allocateIfNecessary(source, k, target);
+ target =
+ SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target);
T[] pool = Arrays.copyOf(source, source.length);
int remaining = pool.length;
for (int i = 0; i < k; i++) {
@@ -653,7 +654,8 @@ public static float[] sample(float[] source, int k, float[] target, RandomGenera
*/
public static T[] sample(T[] source, int k, T[] target, RandomGenerator r) {
SequenceSamplerUtils.validateK(k, source.length);
- target = SequenceSamplerUtils.allocateIfNecessary(source, k, target);
+ target =
+ SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target);
T[] pool = Arrays.copyOf(source, source.length);
int remaining = pool.length;
for (int i = 0; i < k; i++) {
diff --git a/src/main/java/org/cicirello/sequences/SequenceReservoirSampler.java b/src/main/java/org/cicirello/sequences/SequenceReservoirSampler.java
index 98618356..dc7a740b 100644
--- a/src/main/java/org/cicirello/sequences/SequenceReservoirSampler.java
+++ b/src/main/java/org/cicirello/sequences/SequenceReservoirSampler.java
@@ -1,6 +1,6 @@
/*
* JavaPermutationTools: A Java library for computation on permutations and sequences
- * Copyright 2005-2023 Vincent A. Cicirello, .
+ * Copyright 2005-2026 Vincent A. Cicirello, .
*
* This file is part of JavaPermutationTools (https://jpt.cicirello.org/).
*
@@ -237,7 +237,8 @@ public char[] nextSample(String source, int k, char[] target) {
@Override
public T[] nextSample(T[] source, int k, T[] target) {
SequenceSamplerUtils.validateK(k, source.length);
- target = SequenceSamplerUtils.allocateIfNecessary(source, k, target);
+ target =
+ SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target);
System.arraycopy(source, 0, target, 0, k);
for (int i = k; i < source.length; i++) {
int j = r.nextInt(i + 1);
@@ -635,7 +636,8 @@ public static float[] sample(float[] source, int k, float[] target, RandomGenera
*/
public static T[] sample(T[] source, int k, T[] target, RandomGenerator r) {
SequenceSamplerUtils.validateK(k, source.length);
- target = SequenceSamplerUtils.allocateIfNecessary(source, k, target);
+ target =
+ SequenceSamplerUtils.allocateIfNecessary(source.getClass().getComponentType(), k, target);
System.arraycopy(source, 0, target, 0, k);
for (int i = k; i < source.length; i++) {
int j = RandomIndexer.nextInt(i + 1, r);
diff --git a/src/main/java/org/cicirello/sequences/SequenceSamplerUtils.java b/src/main/java/org/cicirello/sequences/SequenceSamplerUtils.java
index c2c82dd5..2e0d9b8e 100644
--- a/src/main/java/org/cicirello/sequences/SequenceSamplerUtils.java
+++ b/src/main/java/org/cicirello/sequences/SequenceSamplerUtils.java
@@ -1,6 +1,6 @@
/*
* JavaPermutationTools: A Java library for computation on permutations and sequences
- * Copyright 2005-2023 Vincent A. Cicirello, .
+ * Copyright 2005-2026 Vincent A. Cicirello, .
*
* This file is part of JavaPermutationTools (https://jpt.cicirello.org/).
*
@@ -42,11 +42,9 @@ static void validateK(int k, int sourceLength) {
}
@SuppressWarnings("unchecked")
- static T[] allocateIfNecessary(T[] source, int k, T[] target) {
- if (target == null) {
- target = (T[]) Array.newInstance(source.getClass().getComponentType(), k);
- } else if (target.length < k) {
- target = (T[]) Array.newInstance(target.getClass().getComponentType(), k);
+ static T[] allocateIfNecessary(Class> componentType, int k, T[] target) {
+ if (target == null || target.length < k) {
+ return (T[]) Array.newInstance(componentType, k);
}
return target;
}