2010-10-28 3 views
1

Как проверить общие подтипы, переданные в качестве параметра?Java Generic - проверка подтипов?

Например:

public class A<T> { public T get();} 
public class AString extends A<String> {} 
public class ADate extends A<Date> {} 

public void checkparam(List<? extends A<?>> params) { 
///Want to check if params is of type List<AString> or List<ADate> ? 
} 

Возможно ли это? Какую часть я не понимаю?

ответ

1

Это невозможно, потому что информация типа такого типа стирается и недоступна во время выполнения. Во время выполнения все, что известно, состоит в том, что параметр checkparam - это List.

+0

я думал так :) – newtoflex4

0

Я не верю, что вы можете сделать это прямо в списке. Вы могли бы сделать чек на первый элемент:

if (!params.isEmpty() && params.get(0) instanceof AString) { 
    // it's List<AString> 
} 
... 

не красиво и не будет работать на пустых списках, но должны работать иначе.

+0

сделал это так .. но компилятор предупреждает: «Тип безопасности: снятие флажка из списка <захват # 7-of? extends A > в список « при отправке в »(список ) params». – newtoflex4

+0

Это не очень эффективный выбор. Например, что, если есть другая реализация 'A ' '' AOtherString', а список на самом деле представляет собой «Список >», который содержит некоторые из них? Если вы попытаетесь использовать все 'A ' '' AString', это приведет к ошибке. Что, если это на самом деле 'List >', в котором есть 'ADate'? – ColinD

0

Это ясно, пытаясь скомпилировать следующий код:

import java.util.Date; 
import java.util.List; 

public class A<T> { 
    private T value; 

    public T get() { 
     return value; 
    } 

    public void checkparam(List<AString> list) { 

    } 

    public void checkparam(List<ADate> list) { 

    } 
} 
class AString extends A<String> {} 
class ADate extends A<Date> {} 

, который производит следующий вывод: JAVAC

$ javac A.java 
A.java:11: name clash: checkparam(java.util.List<AString>) and checkparam(java.util.List<ADate>) have the same erasure 
    public void checkparam(List<AString> list) { 
       ^
A.java:15: name clash: checkparam(java.util.List<ADate>) and checkparam(java.util.List<AString>) have the same erasure 
    public void checkparam(List<ADate> list) { 
       ^
2 errors