Вы можете решить эту проблему с помощью экзистенциального
trait Node[N<:Node[N]] { self:N =>
}
trait A extends Node[A]
trait B {
def list:List[X forSome {type X <: Node[X]}]
def as:List[A] = list.collect { case x:A => x }
}
, просто справедливое предупреждение forSome
будет удалено из скалы в какой-то момент. Можете ли вы рассказать нам больше о том, что вы пытаетесь сделать? Майбер, есть более элегантный способ сделать это
Это означает, что может быть Класс любого типа.? подстановочный знак, обозначающий набор всех типов или 'любого'. Таким образом, можно позже сделать
Integer normalForm = new Integer();
normalFormClass = normalForm.getClass();
или
String normalForm = new String();
normalFormClass = normalForm.getClass();
Если Вы не знаете о дженериках на Java, прочитайте http://java.sun.com/developer/technicalArticles/J2SE/generics/
Что касается то, почему, я думаю, что это могло бы быть к строго специальному, что Вы используете дженерики везде и Ваш код, не совместимо с более старыми версиями Java, или возможно закрывать некоторый триггер счастливые IDE. И да,
Class foo
и
Class<?> foo
эквивалентны.
Кроме того, универсальная версия
Class<?> normalClass = null;
в значительной степени эквивалентно необработанной версии типа,
Class normalClass = null;
основное различие - то, что последний будет совместим с версиями Java, которые не поддерживают дженериков, как Java 1.4.
Класс <T> означает, что начиная с JDK 1.5, Класс является generified типом, который определяет класс. Один способ думать об этом состоит в том, что Класс является фабрикой для создания экземпляров его типа.
А именно, Класс <T> создает экземпляры типа T от Class.newInstance () метод.
От JDK 1.5 на рекомендуется Спецификацией Языка Java не использовать необработанные типы. Так, настоятельно рекомендовано, что при контакте с Экземпляром класса неизвестного типа, необходимо назвать его "Классом <?>" и не просто "Классом". Конечно, если Вы на самом деле знаете тип или некоторых связанных, Вы могли бы найти некоторые преимущества определения его.
Класс или Класс <?> работают одинаково хорошо. Одна причина использовать последнего состоит в том, чтобы избавиться от нескольких предупреждений, которые язь или компилятор бросили бы в Вас при использовании первой формы.
Я сомневаюсь, что это - домашняя работа, так как я никогда не был в классе, который говорил об отражении.
Но это - простое пустое присвоение. Это ничего не делает.