SORU
22 Mayıs 2009, Cuma


Ne zaman Java jenerik < gerektirir mi? uzatır T> yerine <T> ve orada geçiş herhangi bir dezavantajı olur?

Aşağıdaki örnek (Hamcrest matchers ile JUnit kullanarak) verildi

    Map<String, Class<? extends Serializable>> expected = null;
    Map<String, Class<java.util.Date>> result = null;
    assertThat(result, is(expected));

Bu JUnit AssertThat yöntemi ile imza derleme değil:

public static <T> void assertThat(T actual, Matcher<T> matcher)

Derleyici hata iletisi:

Error:Error:line (102)cannot find symbol method
assertThat(java.util.Map<java.lang.String,java.lang.Class<java.util.Date>>,
org.hamcrest.Matcher<java.util.Map<java.lang.String,java.lang.Class
    <? extends java.io.Serializable>>>)

Eğer assertThat değiştirirsem ancak, yöntem imzası:

public static <T> void assertThat(T result, Matcher<? extends T> matcher)

Sonra derleme çalışmaları.

Yani üç soru

  1. Neden tam olarak geçerli sürüm derlemek değil mi? Hayal meyal kovaryans konuları burada anlıyorum da, ben kesinlikle, eğer olsaydı bunu açıklayamıyorlar.
  2. Eşleştirici< assertThat yöntemini değiştirme; herhangi bir dezavantajı var mı? uzanır T>? Eğer bunu yaparsan kıracak başka davalar var mı?
  3. JUnit içinde assertThat yöntemi genericizing için herhangi bir anlamı var mı? Bu Eşleştirici sınıf gibi görünmüyor gerektiriyor beri JUnit aramalar maçlar yöntem, değil daktilo ile herhangi bir genel, ve görünüşe göre bir girişim için güç bir tür güvenliği olan yapmaz, gibi Maçlar olacak aslında maç ve test başarısız olursa olsun. Hayır güvensiz operasyonları (veya öyle görünüyor) dahil.

Başvuru için, burada assertThat bu JUnit uygulanması

public static <T> void assertThat(T actual, Matcher<T> matcher) {
	assertThat("", actual, matcher);
}

public static <T> void assertThat(String reason, T actual,
		Matcher<T> matcher) {
	if (!matcher.matches(actual)) {
		Description description= new StringDescription();
		description.appendText(reason);
		description.appendText("\nExpected: ");
		matcher.describeTo(description);
		description.appendText("\n     got: ").appendValue(actual)
				.appendText("\n");
		throw new java.lang.AssertionError(description.toString());
	}
}

CEVAP
22 Mayıs 2009, Cuma


Birinci http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html -- sizi yönlendirmek için var inanılmaz bir iş yapıyor.

Temel fikir kullanın

<T extends SomeClass>

gerçek parametre SomeClass veya herhangi bir alt türü olabilir.

Örnek

Map<String, Class<? extends Serializable>> expected = null;
Map<String, Class<java.util.Date>> result = null;
assertThat(result, is(expected));

""Seri hale getirilebilir. uygulayan herhangi bir sınıfı temsil eden bir Sınıf nesnesi içerebilir beklenen söylüyorsun Sonuç göster sadece Tarih sınıf nesneleri tutabilir diyor.

Sonuç olarak geçirdiğinizde, String -^ tam Göster için T oluyorsun . Göster Dize - ^ uymuyor ki sınıf nesneleri, tarih . hiçbir şey bu seri hale getirilebilir.

-- Sınıf istediğinizden emin misiniz<Date> ve Tarihi kontrol etmek için bir şey? String -^ bir harita . Sınıf<Date> genel olarak çok yararlı tutabilir tüm değerleri yerine Tarih örnekleri olarak date.class ) gelmiyor

Genericizing assertThat, fikri yöntem sonuç türüne uygun bir Eşleştirici geçirilen sağlayabilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HER0R

    HER0R

    16 Aralık 2007
  • Madeon

    Madeon

    31 Ocak 2010
  • spederson7

    spederson7

    17 Temmuz 2006