java wildcard,解决Java wildcard generic as return warning in Eclipse and SonarQube

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

|

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值