2009-08-10 4 views
4

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

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 

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

+2

Единственное, что я могу думать о том, чтобы проверить затмение соответствие уровня компиляции. Убедитесь, что он установлен на 1.6, возможно, по какой-то причине он по умолчанию не соответствует предыдущей версии. – amischiefr

+0

Мое соответствие - это, безусловно, 1.6 - до сих пор нет кубиков. – banjollity

+1

Does MyObject реализует SomeInterface? –

ответ

1

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

то есть, если ваш метод завода выглядел что-то вроде

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

Где есть некоторый ключ определенного класса что-то вроде этого

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

Давать что-то вроде этого, чтобы вызвать метод, обратите внимание, не дженерик на декларация ключа

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

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

+0

Это близко. Я игнорировал второй параметр для моего метода, который был сборником (wtf !?). Оказывается, это путало компилятор. – banjollity

0

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

2

Вы недавно добавили параметр типа в свой заводский класс? Там в ловушкой с обобщенными методами на сырье типа:

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 
Смежные вопросы