„ Zanieczyszczenie sterty ” jak w typach niepodlegających zwrotowi (Samouczki Java ™> Nauka języka Java> Ogólne (zaktualizowane)) Dlaczego tak się nazywa?
Kilka razy widziałem na tej stronie posty, które potępiają implementację generycznych Java. Teraz mogę szczerze powiedzieć, że nie miałem żadnych problemów z ich używaniem. Jednak sam nie próbowałem stworzyć ogólnej klasy. Jakie masz problemy z ogólną obsługą Javy?
Ostatnio miałem zwyczaj „maskowania” kolekcji Java za pomocą przyjaznych dla ludzi nazw klas. Kilka prostych przykładów: // Facade class that makes code more readable and understandable. public class WidgetCache extends Map<String, Widget> { } Lub: // If you saw a ArrayList<ArrayList<?>> being passed around in the code, would you // …
Przeglądając jakiś kod, zauważyłem możliwość jego zmiany w celu użycia generycznych. Kod (zaciemniony) wygląda następująco: public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets) { var someProperty = typeOfTarget.GetProperty(possibleTargets[0]); ... } Ten kod można zastąpić ogólnymi, takimi jak: public void DoAllTheThings<T>(object[] possibleTargets[0]) { var someProperty = type(T).getProperty(possibleTargets[0]); ... } Badając zalety i wady …
Na przykład mam grę, która ma narzędzia do zwiększenia zdolności gracza: Tool.h class Tool{ public: std::string name; }; I niektóre narzędzia: Sword.h class Sword : public Tool{ public: Sword(){ this->name="Sword"; } int attack; }; Shield.h class Shield : public Tool{ public: Shield(){ this->name="Shield"; } int defense; }; MagicCloth.h class MagicCloth …
Powszechnie przyjmuje się, że niektóre rodzaje Java zawiodły w ważnych sprawach. Połączenie symboli wieloznacznych i granic spowodowało powstanie poważnie nieczytelnego kodu. Jednak gdy patrzę na inne języki, naprawdę nie mogę znaleźć ogólnego systemu typów, z którego programiści są zadowoleni. Jeśli weźmiemy pod uwagę następujące cele projektowania takiego systemu typów: Zawsze …
Załóżmy, że mam dwie klasy, które wyglądają tak (pierwszy blok kodu i ogólny problem są związane z C #): class A { public int IntProperty { get; set; } } class B { public int IntProperty { get; set; } } Klasy te nie mogą być w żaden sposób zmieniane …
Wydaje mi się, że mam nieporozumienie na temat różnicy między <Foo>i <? extends Foo>. Z mojego zrozumienia, gdybyśmy mieli ArrayList<Foo> foos = new ArrayList<>(); Oznacza to, że Foodo tej listy tablic można dodać obiekty typu . Ponieważ podklasy Foosą również typu Foo, można je również dodawać bezbłędnie, jak pokazano za …
Nie pamiętam, kiedy ostatni raz pisałem lekcje ogólne. Za każdym razem, gdy wydaje mi się, że potrzebuję go po pewnym namyśle, wyciągam wniosek, że nie. Druga odpowiedź na to pytanie sprawiła, że poprosiłem o wyjaśnienia (ponieważ nie mogę jeszcze komentować, zadałem nowe pytanie). Weźmy więc podany kod jako przykład przypadku, …
AFAIK, moje klasy klasy extendsnadrzędne i implementsinterfejsy. Ale natrafiam na sytuację, w której nie mogę użyć implements SomeInterface. Jest to deklaracja typów ogólnych. Na przykład: public interface CallsForGrow {...} public class GrowingArrayList <T implements CallsForGrow> // BAD, won't work! extends ArrayList<T> Tutaj używanie implementsjest składniowo zabronione. Najpierw pomyślałem, że używanie …
Pozostaję w środowisku, w którym ludzie wierzą: Generics Java to funkcja używana wyłącznie do pisania bibliotek, a nie do prawdziwego kodowania. C ++ jest językiem programowania OO; templatejest funkcją opcjonalną i możliwą do uniknięcia Chociaż osoby te polegają w dużej mierze na bibliotekach napisanych przy użyciu programowania ogólnego (np. STL, …
W generics C # możemy zadeklarować ograniczenie parametru typu Tdo domyślnego konstruktora, mówiąc where T : new(). Jednak żadne inne ograniczenia tego rodzaju nie są ważne - new(string)na przykład itp. Z jakich powodów projekt i / lub implementacja języka jest tego przyczyną? Czy jest coś w sposobie działania konstruktorów lub …
Załóżmy, że mam tę hierarchię klas ... public abstract class Animal { public abstract void eat(); public abstract void talk(); } class Dog extends Animal { @Override public void eat() { } @Override public void talk() { } } class Cat extends Animal { @Override public void eat() { } …
Jestem prawie pewien, że wszyscy znają ogólne metody formularza: T DoSomething<T>(T item) Ta funkcja jest również nazywana parametrycznie polimorficzną (PP), w szczególności PP rangi 1 . Powiedzmy, że tę metodę można przedstawić za pomocą obiektu funkcji formularza: <T> : T -> T Oznacza to, <T>że pobiera jeden parametr typu i …
To pytanie z perspektywy wewnętrznych kompilatorów. Interesują mnie generyczne, a nie szablony (C ++), więc zaznaczyłem pytanie C #. Nie Java, ponieważ AFAIK generyczne w obu językach różnią się implementacjami. Kiedy patrzę na języki bez generyków, jest to dość proste, możesz zweryfikować definicję klasy, dodać ją do hierarchii i to …
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.