private List gridModel;
public List getGridModel() {
return gridModel;
}
Eclipse shows a warning:
List is a raw type. References to generic type List should be parameterized.
Changing the code to below will remove the warning
private List> gridModel;
public List> getGridModel() {
return gridModel;
}
However the above code shows a Major pitfall error in SonarQube which says:
Remove usage of generic wildcard type. Generic wildcard types should not be used in return parameters
So how can I fix this warning?
I see a similar question here but could not find the solution .
Using Class extends Object> did not remove Sonar warning.
java
generics
return
sonarqube
|
this question
edited May 23 at 10:31
Community ♦ 1 1 asked May 30 '15 at 7:10
Alireza Fattahi 12.3k 5 40 55 3 Just curios as to why can't you use a type parameter for the
getGridModel method or use a type parameter for the
class that has the
gridModel –
CKing May 30 '15 at 7:18
|
3 Answers
3
解决方法
So how can I fix this warning ?
You can use a type parameter for your class :
public class GridModelHolder {
private List gridModel;
public List getGridModel() {
return gridModel;
}
}
The client code can then decide what type of List GridModelHolder holds :
GridModelHolder gridModelHolder = new GridModelHolder(new ArrayList);
However, if you insist on using raw types, you can either suppress the warnings or simply have a List of objects (Neither of these are recommended)
@SuppressWarnings("unchecked")
public class GridModelHolder {
private List gridModel;
public List getGridModel() {
return gridModel;
}
}
OR
public class GridModelHolder {
private List gridModel;
public List getGridModel() {
return gridModel;
}
}
|
this answer
edited Jul 8 '15 at 10:49 answered May 30 '15 at 7:21
CKing 10.5k 3 23 60
|
Did you find this question interesting? Try our newsletter
Sign up for our newsletter and get our top new questions delivered to your inbox (see an example).
Subscribed!
Success! Please click the link in the confirmation email to activate your subscription.
Make the class take a generic. Apply that generic to the List. Also, the warning is valid (a collection type without a generic is a raw type). Something like,
class MyClass {
private List gridModel;
public List getGridModel() {
return gridModel;
}
}
If you really want to disable the type-checking then make the List generic on Object (which is what a raw type is) like
private List gridModel;
public List getGridModel() {
return gridModel;
}
|
this answer answered May 30 '15 at 7:19
Elliott Frisch 125k 12 62 124
|
I'm sorry, that doesn't make sense; there's nothing wrong with returning Foo> if the API needs to. Even the Object class has a method like that.
Here's the list of public methods in JDK that return with wildcards:
(There are more in javax, but the list is too long to be posted on stackoverflow. See complete list )
java.awt.Font#getAttributes -> java.util.Map
java.awt.Toolkit#mapInputMethodHighlight -> java.util.Map
java.awt.datatransfer.DataFlavor#getDefaultRepresentationClass -> java.lang.Class>
java.awt.datatransfer.DataFlavor#getRepresentationClass -> java.lang.Class>
java.awt.im.InputMethodHighlight#getStyle -> java.util.Map
java.beans.BeanDescriptor#getBeanClass -> java.lang.Class>
java.beans.BeanDescriptor#getCustomizerClass -> java.lang.Class>
java.beans.EventSetDescriptor#getListenerType -> java.lang.Class>
java.beans.IndexedPropertyDescriptor#getIndexedPropertyType -> java.lang.Class>
java.beans.PropertyDescriptor#getPropertyEditorClass -> java.lang.Class>
java.beans.PropertyDescriptor#getPropertyType -> java.lang.Class>
java.io.ObjectStreamClass#forClass -> java.lang.Class>
java.io.ObjectStreamField#getType -> java.lang.Class>
java.lang.Class#asSubclass -> java.lang.Class extends U>
java.lang.Class#forName -> java.lang.Class>
java.lang.Class#getComponentType -> java.lang.Class>
java.lang.Class#getDeclaringClass -> java.lang.Class>
java.lang.Class#getEnclosingClass -> java.lang.Class>
java.lang.Class#getEnclosingConstructor -> java.lang.reflect.Constructor>
java.lang.Class#getSuperclass -> java.lang.Class super T>
java.lang.ClassLoader#loadClass -> java.lang.Class>
java.lang.EnumConstantNotPresentException#enumType -> java.lang.Class extends java.lang.Enum>
java.lang.Object#getClass -> java.lang.Class>
java.lang.annotation.Annotation#annotationType -> java.lang.Class extends java.lang.annotation.Annotation>
java.lang.annotation.IncompleteAnnotationException#annotationType -> java.lang.Class extends java.lang.annotation.Annotation>
java.lang.annotation.Repeatable#value -> java.lang.Class extends java.lang.annotation.Annotation>
java.lang.instrument.ClassDefinition#getDefinitionClass -> java.lang.Class>
java.lang.invoke.MethodHandleInfo#getDeclaringClass -> java.lang.Class>
java.lang.invoke.MethodHandleProxies#wrapperInstanceType -> java.lang.Class>
java.lang.invoke.MethodHandles$Lookup#lookupClass -> java.lang.Class>
java.lang.invoke.MethodType#parameterType -> java.lang.Class>
java.lang.invoke.MethodType#returnType -> java.lang.Class>
java.lang.ref.ReferenceQueue#poll -> java.lang.ref.Reference extends T>
java.lang.ref.ReferenceQueue#remove -> java.lang.ref.Reference extends T>
java.lang.reflect.Executable#getDeclaringClass -> java.lang.Class>
java.lang.reflect.Field#getDeclaringClass -> java.lang.Class>
java.lang.reflect.Field#getType -> java.lang.Class>
java.lang.reflect.Member#getDeclaringClass -> java.lang.Class>
java.lang.reflect.Method#getDeclaringClass -> java.lang.Class>
java.lang.reflect.Method#getReturnType -> java.lang.Class>
java.lang.reflect.Parameter#getType -> java.lang.Class>
java.lang.reflect.Proxy#getProxyClass -> java.lang.Class>
java.rmi.activation.ActivationDesc#getData -> java.rmi.MarshalledObject>
java.rmi.activation.ActivationGroupDesc#getData -> java.rmi.MarshalledObject>
java.rmi.activation.ActivationInstantiator#newInstance -> java.rmi.MarshalledObject extends java.rmi.Remote>
java.rmi.activation.Activator#activate -> java.rmi.MarshalledObject extends java.rmi.Remote>
java.rmi.server.LoaderHandler#loadClass -> java.lang.Class>
java.rmi.server.RMIClassLoader#loadClass -> java.lang.Class>
java.rmi.server.RMIClassLoader#loadProxyClass -> java.lang.Class>
java.rmi.server.RMIClassLoaderSpi#loadClass -> java.lang.Class>
java.rmi.server.RMIClassLoaderSpi#loadProxyClass -> java.lang.Class>
java.security.acl.Group#members -> java.util.Enumeration extends java.security.Principal>
java.security.cert.CertPath#getCertificates -> java.util.List extends java.security.cert.Certificate>
java.security.cert.CertStore#getCRLs -> java.util.Collection extends java.security.cert.CRL>
java.security.cert.CertStore#getCertificates -> java.util.Collection extends java.security.cert.Certificate>
java.security.cert.CertStoreSpi#engineGetCRLs -> java.util.Collection extends java.security.cert.CRL>
java.security.cert.CertStoreSpi#engineGetCertificates -> java.util.Collection extends java.security.cert.Certificate>
java.security.cert.CertificateFactory#generateCRLs -> java.util.Collection extends java.security.cert.CRL>
java.security.cert.CertificateFactory#generateCertificates -> java.util.Collection extends java.security.cert.Certificate>
java.security.cert.CertificateFactorySpi#engineGenerateCRLs -> java.util.Collection extends java.security.cert.CRL>
java.security.cert.CertificateFactorySpi#engineGenerateCertificates -> java.util.Collection extends java.security.cert.Certificate>
java.security.cert.CollectionCertStoreParameters#getCollection -> java.util.Collection>
java.security.cert.PolicyNode#getChildren -> java.util.Iterator extends java.security.cert.PolicyNode>
java.security.cert.PolicyNode#getPolicyQualifiers -> java.util.Set extends java.security.cert.PolicyQualifierInfo>
java.security.cert.X509CRL#getRevokedCertificates -> java.util.Set extends java.security.cert.X509CRLEntry>
java.time.chrono.ChronoLocalDate#atTime -> java.time.chrono.ChronoLocalDateTime>
java.time.chrono.ChronoLocalDateTime#from -> java.time.chrono.ChronoLocalDateTime>
java.time.chrono.ChronoZonedDateTime#from -> java.time.chrono.ChronoZonedDateTime>
java.time.chrono.Chronology#localDateTime -> java.time.chrono.ChronoLocalDateTime extends java.time.chrono.ChronoLocalDate>
java.time.chrono.Chronology#zonedDateTime -> java.time.chrono.ChronoZonedDateTime extends java.time.chrono.ChronoLocalDate>
java.util.IllegalFormatConversionException#getArgumentClass -> java.lang.Class>
java.util.PriorityQueue#comparator -> java.util.Comparator super E>
java.util.Properties#propertyNames -> java.util.Enumeration>
java.util.SortedMap#comparator -> java.util.Comparator super K>
java.util.SortedSet#comparator -> java.util.Comparator super E>
java.util.Spliterator#getComparator -> java.util.Comparator super T>
java.util.TreeMap#comparator -> java.util.Comparator super K>
java.util.TreeSet#comparator -> java.util.Comparator super E>
java.util.concurrent.AbstractExecutorService#submit -> java.util.concurrent.Future>
java.util.concurrent.ConcurrentSkipListMap#comparator -> java.util.Comparator super K>
java.util.concurrent.ConcurrentSkipListSet#comparator -> java.util.Comparator super E>
java.util.concurrent.CountedCompleter#firstComplete -> java.util.concurrent.CountedCompleter>
java.util.concurrent.CountedCompleter#getCompleter -> java.util.concurrent.CountedCompleter>
java.util.concurrent.CountedCompleter#getRoot -> java.util.concurrent.CountedCompleter>
java.util.concurrent.CountedCompleter#nextComplete -> java.util.concurrent.CountedCompleter>
java.util.concurrent.ExecutorService#submit -> java.util.concurrent.Future>
java.util.concurrent.ForkJoinPool#submit -> java.util.concurrent.ForkJoinTask>
java.util.concurrent.ForkJoinTask#adapt -> java.util.concurrent.ForkJoinTask>
java.util.concurrent.PriorityBlockingQueue#comparator -> java.util.Comparator super E>
java.util.concurrent.ScheduledExecutorService#schedule -> java.util.concurrent.ScheduledFuture>
java.util.concurrent.ScheduledExecutorService#scheduleAtFixedRate -> java.util.concurrent.ScheduledFuture>
java.util.concurrent.ScheduledExecutorService#scheduleWithFixedDelay -> java.util.concurrent.ScheduledFuture>
java.util.concurrent.ScheduledThreadPoolExecutor#schedule -> java.util.concurrent.ScheduledFuture>
java.util.concurrent.ScheduledThreadPoolExecutor#scheduleAtFixedRate -> java.util.concurrent.ScheduledFuture>
java.util.concurrent.ScheduledThreadPoolExecutor#scheduleWithFixedDelay -> java.util.concurrent.ScheduledFuture>
java.util.concurrent.ScheduledThreadPoolExecutor#submit -> java.util.concurrent.Future>
java.util.stream.Collectors#averagingDouble -> java.util.stream.Collector
java.util.stream.Collectors#averagingInt -> java.util.stream.Collector
java.util.stream.Collectors#averagingLong -> java.util.stream.Collector
java.util.stream.Collectors#counting -> java.util.stream.Collector
java.util.stream.Collectors#groupingBy -> java.util.stream.Collector
java.util.stream.Collectors#groupingBy -> java.util.stream.Collector>
java.util.stream.Collectors#groupingBy -> java.util.stream.Collector>>
java.util.stream.Collectors#groupingByConcurrent -> java.util.stream.Collector
java.util.stream.Collectors#groupingByConcurrent -> java.util.stream.Collector>
java.util.stream.Collectors#groupingByConcurrent -> java.util.stream.Collector>>
java.util.stream.Collectors#joining -> java.util.stream.Collector
java.util.stream.Collectors#mapping -> java.util.stream.Collector
java.util.stream.Collectors#maxBy -> java.util.stream.Collector>
java.util.stream.Collectors#minBy -> java.util.stream.Collector>
java.util.stream.Collectors#partitioningBy -> java.util.stream.Collector>
java.util.stream.Collectors#partitioningBy -> java.util.stream.Collector>>
java.util.stream.Collectors#reducing -> java.util.stream.Collector
java.util.stream.Collectors#reducing -> java.util.stream.Collector
java.util.stream.Collectors#reducing -> java.util.stream.Collector>
java.util.stream.Collectors#summarizingDouble -> java.util.stream.Collector
java.util.stream.Collectors#summarizingInt -> java.util.stream.Collector
java.util.stream.Collectors#summarizingLong -> java.util.stream.Collector
java.util.stream.Collectors#summingDouble -> java.util.stream.Collector
java.util.stream.Collectors#summingInt -> java.util.stream.Collector
java.util.stream.Collectors#summingLong -> java.util.stream.Collector
java.util.stream.Collectors#toCollection -> java.util.stream.Collector
java.util.stream.Collectors#toConcurrentMap -> java.util.stream.Collector
java.util.stream.Collectors#toConcurrentMap -> java.util.stream.Collector>
java.util.stream.Collectors#toList -> java.util.stream.Collector>
java.util.stream.Collectors#toMap -> java.util.stream.Collector
java.util.stream.Collectors#toMap -> java.util.stream.Collector>
java.util.stream.Collectors#toSet -> java.util.stream.Collector>
java.util.zip.ZipFile#entries -> java.util.Enumeration extends java.util.zip.ZipEntry>
java.util.zip.ZipFile#stream -> java.util.stream.Stream extends java.util.zip.ZipEntry>
|
this answer
edited May 30 '15 at 18:22 answered May 30 '15 at 16:31
ZhongYu 13.2k 3 15 38 What's the point of a List if you can't add or get elements from it? Also, the reason why getClass uses an unbounded wildcard is because most of the methods in
Class don't really need the type information to do their job. –
CKing May 30 '15 at 20:10 you can get elements from a
List>. –
ZhongYu May 30 '15 at 21:22 Surely you can. But you are missing the point. In this particular question, what's the point if the
List can hold only
null values? –
CKing May 31 '15 at 7:45
|