2010-08-17 2 views
1

Рассмотрев официальный учебник по Java и некоторые потоки из прошлого, несколько вещей остаются неясными, и поэтому я был бы рад, если бы кто-нибудь объяснил это словами.Generics in Java

Class valueClass = agp.getValueClass(); ///the method's return type is Class<?> 

if(Double.class.equals(valueClass)) 
{ 
... 
} 

С учетом того, что моя IDE показывает мне необработанное предупреждение. Я изменил первую строку на

Class<?> valueClass = agp.getValueClass(); 

Какие еще разумные альтернативы у меня есть и какие эффекты они приносят?

Заранее спасибо.

ответ

4

Существует одна альтернатива:

Double.class.isAssignableFrom(valueClass) 

Это не только проверить valueClass для равенства, но и «позволяет» подклассы Double.


Кроме того, ваша agp переменная, вероятно, имеет значение, а также. Предполагая, что есть getValue() метод, который, вероятно, возвращает тип Object, вы могли бы использовать instanceof:

if(agp.getValue()!=null){ 
    if(agp.getValue().getClass() instanceof Double){ //getClass() returns the runtime class 
    //it's a (subclass of) Double! 
    } 
} 
+0

Возвращаемое значение упомянутого метода не является обязательным. Двойной – kerrl

+0

В этом случае метод, указанный мной, вернет false. Вы ищете другое поведение? – f1sh

+0

Я ищу другой родовой вариант, альтернативный «», который может иметь больше смысла. Кроме того, краткое объяснение используемого генератора было бы замечательным ;-) – kerrl

1

Мой IDE показывает мне предупреждение сырого типа.

Вы должны указать локальную переменную того же типа, что и метод. Поскольку метод возвращает Class<?>, это то, что вам нужно использовать. В этот момент невозможно ограничить общий параметр.

+0

Что означает «»? По-моему, это может быть любой класс. В какой степени это ' 'отличается от' '? – kerrl

+0

Это означает «что угодно». ' 'означает что-либо, что расширяет' Object'. Они не то же самое, что и компилятор, потому что два «anythings» могут быть разными. –

+0

'?' Является заполнителем для инкапсулированного типа. 'Класс ' в основном означает «любой тип». 'Class 'в основном утверждает, что инкапсулированный тип/должен быть подклассом' Object'.Это тривиально, поскольку все подклассы типа из «Object», но ваша среда IDE все равно будет показывать предупреждение, если вы его не напишете. – f1sh

0

Спасибо всем, теперь я ясно на этом :-)

С

Class<?> 

это может быть просто любой класс, даже сам объект, в то время как с

Class<? extends Object> 

принимается только подтип объекта (таким образом, не сам объект).

+2

Неверно! 'Class 'также может содержать' Class '. Другими словами, 'extends Object' ** включает **' Object'. Они в значительной степени эквивалентны. –

+0

В значительной степени, есть ли вообще разница? – kerrl

+0

нет, нет разница вообще. Точно так же, как при определении класса, вы можете явно сказать 'extends Object', если хотите, но он не имеет функциональных различий. На самом деле, в моей среде IDE (IntelliJ) вы получаете желтое короткое предупреждение о том, что «...»? Extends Object «избыточно», подумайте о замене на «?». –