Динамические методы возвращают типы в Java - PullRequest
1 голос
/ 03 ноября 2009

Следующий код делает именно то, что я хочу, но мне любопытно, есть ли лучший способ сделать это. Это было бы намного проще, если бы интерфейсы допускали статические методы или если бы методы Java могли быть обобщены / параметризованы настолько, насколько это возможно в C #.

Я бы лучше заменил параметр "Class<TParsedClass> c" на "Class<AbstractClass> c". Для меня "Class<AbstractClass>" означает класс, который расширяет определенный абстрактный класс, но, очевидно, это неправильно, потому что когда я использую этот параметр и использую его, как я описал выше, я получаю ошибки компилятора.

public <TData, TParsedClass> TParsedClass convert(TData data, Class<TParsedClass> c)
{
    try 
    {
        return (TParsedClass)c.getMethod("parse", data.getClass()).invoke(c, data);
    } 
    catch(Exception e)
    {
        e.printStackTrace();
        return null;
    }
}

Ответы [ 3 ]

5 голосов
/ 03 ноября 2009

Да, есть лучший способ. Используйте интерфейсы:

public interface Parser< TData, TParsedClass >
{
    TParsedClass parse( TData data );
}

public class IntParser
    implements Parser< String, Integer >
{
    public Integer parse( String data )
    {
       return Integer.valueOf( data );
    }
}

public <TData, TParsedData> TParsedData convert(
        TData data,
        Parser< TData, TParsedData > parser
    )
{
    return parser.parse( data );
}
0 голосов
/ 03 ноября 2009

Вы можете определить TParsedClass, так как TParsedClass расширяет AbstractClass, но объект Class не представляет абстрактный класс, это способ ссылки на определение типа через отражение.

0 голосов
/ 03 ноября 2009

Очень трудно догадаться, что вы «точно хотите сделать», но я полагаю, у вас есть какой-то TParsedClass со статическим методом анализа, который заполняет новый экземпляр TParsedClass данными из экземпляра TData.

Если вы считаете, что вам нужен какой-то маркер интерфейса, чтобы указать, какой другой объект может анализировать класс, почему бы вам не реализовать метод разбора как нестатический метод, который заполняет «this» данными из переданного Объект

* 1005 Е.Г. *

public class A implements Parser<B> {
    public void parse(B b) {
        this.foo = b.foo;
        this.bar = b.bar;
    }
 }

Чтобы преобразовать, вы должны сделать что-то вроде этого:

A a = new A();
a.parse(b);

вместо

A a = A.parse(b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...