2012-05-07 3 views
6

Я учусь в Java родовое, я загвоздка в какой-то проблемы инстанцировании типа, полученные от общих параметров (это возможно в C#, хотя)инстанцировании Generic в

class Person { 
    public static <T> T say() { 
     return new T; // this has error 
    } 
} 

Я попытался это: generics in Java - instantiating T

public static <T> T say(Class<?> t) { 
    return t.newInstance(); 
} 

Ошибка:

incompatible types 
found : capture#426 of ? 
     required: T 

Это не работает. Следующее выглядит нормально, но это влечет за собой инстанцирование некоторого класса, не может быть использован на статическом методе: Instantiating generics type in java

public class Abc<T> 
{ 

    public T getInstanceOfT(Class<T> aClass) 
    { 
     return aClass.newInstance(); 
    }  

} 

ли это типа стирания Java люди говорят? Это ограничение стирания типа?

В чем проблема с этой проблемой?

ответ

8

Вы были очень близки. Вам нужно заменить Class<?> (что означает «класс любого типа») с Class<T> (что означает «класс типа Т»):

public static <T> T say(Class<T> t) throws IllegalAccessException, InstantiationException { 
    return t.newInstance(); 
} 
+0

+1 и принято, не так элегантно, как C#, хотя (не ваш ошибка ;-)). Кстати, это то, что они называли стиранием стилей, поэтому он не может создать экземпляр T напрямую? – Hao

+1

@Hao: точно: фактический тип T недоступен во время выполнения, поэтому вам нужно передать объект класса, чтобы он был явным. –

Смежные вопросы