Skip to content

Commit 1bee71f

Browse files
slandellenormanmaurer
authored andcommitted
Fix PlatformDependent.newAtomic*FieldUpdater type safety
Motivation: * newAtomicIntegerFieldUpdater and newAtomicLongFieldUpdater take a class<?> so they're too lax * newAtomicReferenceFieldUpdater takes a Class<U> so it's too strict and can only be passe a rawtype parameter when dealing w/ generic classes Modifications: Take a Class<? super T> parameter instead. Result: Better type safety and generics support.
1 parent e578134 commit 1bee71f

File tree

5 files changed

+12
-9
lines changed

5 files changed

+12
-9
lines changed

common/src/main/java/io/netty/util/internal/PlatformDependent.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ public static int hashCodeAscii(CharSequence bytes) {
555555
* use {@link AtomicReferenceFieldUpdater#newUpdater(Class, Class, String)} as fallback.
556556
*/
557557
public static <U, W> AtomicReferenceFieldUpdater<U, W> newAtomicReferenceFieldUpdater(
558-
Class<U> tclass, String fieldName) {
558+
Class<? super U> tclass, String fieldName) {
559559
if (hasUnsafe()) {
560560
try {
561561
return PlatformDependent0.newAtomicReferenceFieldUpdater(tclass, fieldName);
@@ -572,7 +572,7 @@ public static <U, W> AtomicReferenceFieldUpdater<U, W> newAtomicReferenceFieldUp
572572
* use {@link AtomicIntegerFieldUpdater#newUpdater(Class, String)} as fallback.
573573
*/
574574
public static <T> AtomicIntegerFieldUpdater<T> newAtomicIntegerFieldUpdater(
575-
Class<?> tclass, String fieldName) {
575+
Class<? super T> tclass, String fieldName) {
576576
if (hasUnsafe()) {
577577
try {
578578
return PlatformDependent0.newAtomicIntegerFieldUpdater(tclass, fieldName);
@@ -589,7 +589,7 @@ public static <T> AtomicIntegerFieldUpdater<T> newAtomicIntegerFieldUpdater(
589589
* use {@link AtomicLongFieldUpdater#newUpdater(Class, String)} as fallback.
590590
*/
591591
public static <T> AtomicLongFieldUpdater<T> newAtomicLongFieldUpdater(
592-
Class<?> tclass, String fieldName) {
592+
Class<? super T> tclass, String fieldName) {
593593
if (hasUnsafe()) {
594594
try {
595595
return PlatformDependent0.newAtomicLongFieldUpdater(tclass, fieldName);

common/src/main/java/io/netty/util/internal/PlatformDependent0.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -484,17 +484,17 @@ private static int hashCodeAsciiSanitizeFromChar(short value) {
484484
}
485485

486486
static <U, W> AtomicReferenceFieldUpdater<U, W> newAtomicReferenceFieldUpdater(
487-
Class<U> tclass, String fieldName) throws Exception {
487+
Class<? super U> tclass, String fieldName) throws Exception {
488488
return new UnsafeAtomicReferenceFieldUpdater<U, W>(UNSAFE, tclass, fieldName);
489489
}
490490

491491
static <T> AtomicIntegerFieldUpdater<T> newAtomicIntegerFieldUpdater(
492-
Class<?> tclass, String fieldName) throws Exception {
492+
Class<? super T> tclass, String fieldName) throws Exception {
493493
return new UnsafeAtomicIntegerFieldUpdater<T>(UNSAFE, tclass, fieldName);
494494
}
495495

496496
static <T> AtomicLongFieldUpdater<T> newAtomicLongFieldUpdater(
497-
Class<?> tclass, String fieldName) throws Exception {
497+
Class<? super T> tclass, String fieldName) throws Exception {
498498
return new UnsafeAtomicLongFieldUpdater<T>(UNSAFE, tclass, fieldName);
499499
}
500500

common/src/main/java/io/netty/util/internal/UnsafeAtomicIntegerFieldUpdater.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ final class UnsafeAtomicIntegerFieldUpdater<T> extends AtomicIntegerFieldUpdater
2525
private final long offset;
2626
private final Unsafe unsafe;
2727

28-
UnsafeAtomicIntegerFieldUpdater(Unsafe unsafe, Class<?> tClass, String fieldName) throws NoSuchFieldException {
28+
UnsafeAtomicIntegerFieldUpdater(Unsafe unsafe, Class<? super T> tClass, String fieldName)
29+
throws NoSuchFieldException {
2930
Field field = tClass.getDeclaredField(fieldName);
3031
if (!Modifier.isVolatile(field.getModifiers())) {
3132
throw new IllegalArgumentException("Must be volatile");

common/src/main/java/io/netty/util/internal/UnsafeAtomicLongFieldUpdater.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ final class UnsafeAtomicLongFieldUpdater<T> extends AtomicLongFieldUpdater<T> {
2525
private final long offset;
2626
private final Unsafe unsafe;
2727

28-
UnsafeAtomicLongFieldUpdater(Unsafe unsafe, Class<?> tClass, String fieldName) throws NoSuchFieldException {
28+
UnsafeAtomicLongFieldUpdater(Unsafe unsafe, Class<? super T> tClass, String fieldName)
29+
throws NoSuchFieldException {
2930
Field field = tClass.getDeclaredField(fieldName);
3031
if (!Modifier.isVolatile(field.getModifiers())) {
3132
throw new IllegalArgumentException("Must be volatile");

common/src/main/java/io/netty/util/internal/UnsafeAtomicReferenceFieldUpdater.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ final class UnsafeAtomicReferenceFieldUpdater<U, M> extends AtomicReferenceField
2525
private final long offset;
2626
private final Unsafe unsafe;
2727

28-
UnsafeAtomicReferenceFieldUpdater(Unsafe unsafe, Class<U> tClass, String fieldName) throws NoSuchFieldException {
28+
UnsafeAtomicReferenceFieldUpdater(Unsafe unsafe, Class<? super U> tClass, String fieldName)
29+
throws NoSuchFieldException {
2930
Field field = tClass.getDeclaredField(fieldName);
3031
if (!Modifier.isVolatile(field.getModifiers())) {
3132
throw new IllegalArgumentException("Must be volatile");

0 commit comments

Comments
 (0)