Создать новый экземпляр T в Java - PullRequest
2 голосов
/ 19 апреля 2011

в C #, мы можем определить общий class A<T> where T : new().В этом коде мы можем создать экземпляр T с new T().Как это реализовать в Java?Я прочитал статью, в которой говорится, что это невозможно.

Причина, по которой я использовал, имеет одноэлементный шаблон, использующий generic в C #, например:

public static class Singleton<T> where T : new()
{
    private static T instance;

    public static T Instance
    {
        get 
        {
            if (instance == null)
            {
                instance = SingletonCreater.Instance;
            }
            return instance;
        }
    }

    static class SingletonCreater
    {
        internal static readonly T Instance = new T();
    }
}

И способ сделать этот метод более изящным?*

Ответы [ 3 ]

7 голосов
/ 19 апреля 2011

Нет, вы не можете сделать новый T (), поскольку вы не знаете, есть ли у T конструктор no arg, и потому что тип T отсутствует во время выполнения из-за стирания типа .

Чтобы создать экземпляр T, вам нужно иметь такой код,

public <T> T create(Class<T> clazz) {
    try {
        //T must have a no arg constructor for this to work 
        return clazz.newInstance(); 
    } catch (InstantiationException e) {
        throw new IllegalStateException(e);
    } catch (IllegalAccessException e) {
        throw new IllegalStateException(e);
}
1 голос
/ 19 апреля 2011

Да, new T() невозможно, так как generic - это функция времени компиляции в Java.Во время выполнения общая информация теряется;следовательно, вы не сможете выполнить new T(), поскольку JVM не знает, что такое T во время выполнения.

Возможно, вам не повезло использовать точный синтаксис, который вы упомянули при использовании Java.

0 голосов
/ 19 апреля 2011

Спасибо, ребята, в общем, мы не можем использовать его в JAVA.Как и в случае с Sbridges, в C # мы можем реализовать так:

static T Create(Type type)
{
    return (T)Activator.CreateInstance(type);
}

или даже проще:

static T Create()
{
    return Activator.CreateInstance<T>();
}

Просто дайте вам знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...