При экспериментировании с кодом я заметил что-то очень интересное.Для того, чтобы удалить ошибку компиляции:
Error: Type mismatch: cannot convert from element type Object to HelloWorld.Type
Так как с указанием возвращенного элемент имеет тип Object
я решил типовому бросайте его List<Type>
как показано ниже:
public static void main(String[] args) {
for (Type type : (List<Type>)new HelloWorld().getTypes()) {
}
}
Это успешно скомпилирован с предупреждением, так Я использовал -Xlint
с javac
, чтобы увидеть, что это предупреждение, и я нашел следующее:
HelloWorld.java:15: warning: [rawtypes] found raw type: HelloWorld
for (Type type : (List<Type>)new HelloWorld().getTypes()) {
^
missing type arguments for generic class HelloWorld<T>
where T is a type-variable:
T extends Object declared in class HelloWorld
HelloWorld.java:15: warning: [unchecked] unchecked cast
for (Type type : (List<Type>)new HelloWorld().getTypes()) {
^
required: List<Type>
found: List
2 warnings
Здесь я был поражен, увидев второе предупреждение. В нем указано, что требуется List<Type>
, но найдено List
a RAW TYPE. Таким образом, это означает, что если вы инициализируете объект необработанного типа и вызываете метод, который возвращает переменную с генериками, эта переменная также будет преобразована в RAW TYPE. Для того, чтобы проверить это я реализовал класс HelloWorldTest
как:
public class HelloWorldTest<T>{
private T t;
public HelloWorldTest(T t){
this.t = t;
}
public T getT(){
return t;
}
}
Затем я изменил код, чтобы проверить состояние как:
public class HelloWorld<T> {
private HelloWorldTest<Integer> test = new HelloWorldTest<>(1);
public HelloWorldTest<Integer> getTest(){
return test;
}
public static void main(String[] args) {
HelloWorldTest<Integer> hello = new HelloWorld().getTest();
}
}
компилируется успешно, но с предупреждениями, так используя -Xlint
переключатель для компиляции I получить следующие предупреждения:
HelloWorld.java:10: warning: [rawtypes] found raw type: HelloWorld
HelloWorldTest<Integer> hello = new HelloWorld().getTest();
^
missing type arguments for generic class HelloWorld<T>
where T is a type-variable:
T extends Object declared in class HelloWorld
HelloWorld.java:10: warning: [unchecked] unchecked conversion
HelloWorldTest<Integer> hello = new HelloWorld().getTest();
^
required: HelloWorldTest<Integer>
found: HelloWorldTest
2 warnings
Итак, здесь мы также находим, что HelloWorldTest
был преобразован в сырье тип.
Наконец, мы можем заключить, что: Если вы инициализируете объект необработанного типа и вызываете метод, который возвращает переменную с генериками, эта переменная также будет преобразована в RAW TYPE.
Теперь, когда я заменил
HelloWorldTest<Integer> hello = new HelloWorld().getTest();
с
Integer hello = new HelloWorld().getTest().getT();
Как и ожидалось, я получил ошибку:
HelloWorld.java:10: error: incompatible types: Object cannot be converted to Integer
Integer hello = new HelloWorld().getTest().getT();
^
1 error
Наконец, если заменить основной метод в моей реализации HelloWorld
класса с:
public static void main(String[] args) {
String hello = (String) new HelloWorld().getTest().getT();
}
Он успешно компилируется только предупреждение бытия:
HelloWorld.java:10: warning: [rawtypes] found raw type: HelloWorld
String hello = (String) new HelloWorld().getTest().getT();
^
missing type arguments for generic class HelloWorld<T>
where T is a type-variable:
T extends Object declared in class HelloWorld
1 warning
Это довольно заблуждение, поскольку это, безусловно, работать на ошибки во время выполнения и снова иллюстрирует опасность RAW TYPE в дженерик.
... вы связались с онлайн-компилятором, но не прочитали его вывод? 'HelloWorld.java:17: ошибка: несовместимые типы: объект не может быть преобразован в Type' - это ошибка, которую он дает. – Dragondraikk
Я видел ошибку. Почему это происходит? GetTypes() не использует общий тип параметра. Тип возвращаемого метода задается явно. – Mirian
Тот факт, что «Тип» является приватным, и «getTypes» публично возвращает список этих частных объектов, он не вызывает никого, кроме меня? – Orace