Причина, по которой вы не можете сделать это, состоит в том, что список доступен для записи. Предположим, что это было законно, и посмотрите, что пойдет не так:
List<Cat> cats = new List<Cat>();
List<Animal> animals = cats; // Trouble brewing...
animals.Add(new Dog()); // hey, we just added a dog to a list of cats...
cats[0].Speak(); // Woof!
Хорошо, собака, мои кошки, это плохо.
Функция, которую вы хотите, называется «общей ковариацией», и она поддерживается в C # 4 для интерфейсов, которые, как известно, являются безопасными. IEnumerable<T>
не имеет никакого способа записи в последовательность, поэтому он безопасен.
class Animal
{
public virtual void Play(IEnumerable<Animal> animals) { }
}
class Cat : Animal
{
public override void Play(IEnumerable<Animal> animals) { }
}
class Program
{
static void Main()
{
Cat cat = new Cat();
cat.Play(new List<Cat>());
}
}
Это будет работать на C # 4, потому что List<Cat>
конвертируется в IEnumerable<Cat>
, который можно конвертировать в IEnumerable<Animal>
. Нельзя использовать Play IEnumerable<Animal>
, чтобы добавить собаку к тому, что на самом деле является списком кошек.
Java
setStateListAnimator(null);
XML
android:stateListAnimator="@null"
Переопределить высоту по умолчанию FAB, добавив
android:elevation="0dp"
использовать этот код
android:elevation="0dp"
app:elevation="0dp"