Почему мой общий метод перестал работать? - PullRequest
4 голосов
/ 10 августа 2009

В моем проекте у меня есть метод фабрики, который загружает объект, который реализует интерфейс. Вы переходите в желаемый вами класс и получаете его экземпляр, вот так.

public class Factory {
    public static <E extends SomeInterface> E load( Class<E> clss ) throws Exception {
        return clss.newInstance();
    }
}

Вы можете вызвать это так:

MyObject obj = Factory.load( MyObject.class );

Этот код прекрасно работает в Eclipse 3.4 с Java 6u13, однако сегодня я получил новый ноутбук и установил Eclipse 3.5 и java 6u15, и теперь я везде получаю несоответствия типов.

MyObject obj = Factory.load( MyObject.class );
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
               Type mismatch: cannot convert from SomeInterface to MyObject

Помещение броска перед Фабрикой на этой линии заставляет его уйти и все работает хорошо, но это делает линию немного менее чистой, и мне она раньше не нужна, так что же дает?

Ответы [ 4 ]

2 голосов
/ 11 августа 2009

Вы недавно добавили параметр типа в свой фабричный класс? Существует ловушка с универсальными методами для необработанных типов:

  public class FooFactory<UnrelatedArg> {
    public <E> E load(Class<E> c) { ... }
  }

  FooFactory<?> f; f.load(String.class); // returns String
  FooFactory    f; f.load(String.class); // returns Object
1 голос
/ 10 августа 2009

Это весь код, необходимый для получения этой ошибки? Я видел нечто очень похожее в каком-то коде, который смотрел сегодня. Был добавлен дополнительный параметр в эквивалент вашего метода Factory, который также имел универсальный тип. Здесь не хватало его общего определения, и я думаю, что он виноват в том, что запутал компилятор

т. Е. Если ваш фабричный метод был похож на

public class Factory {
    public static <E extends SomeInterface> E load( Class<E> class, Key key ) {
        // return an instance of E
    }
}

Там, где есть некоторый класс Key, определенный как этот

public class Key<Datatype> {
    ....
}

Давая что-то подобное для вызова метода, обратите внимание на отсутствие обобщений при объявлении ключа

Key key = new Key()
MyObject obj = Factory.load( MyObject.class, key );

Надеюсь, это поможет,

0 голосов
/ 23 сентября 2009
0 голосов
/ 10 августа 2009

Я думаю, что это связано с уровнем компиляции Java. По умолчанию проект имеет уровень по умолчанию. Который вы устанавливаете в настройках Eclipse. В вашей старой установке вам придется изменить его.

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