9 Aralık 2019 Pazartesi

Generics ve Type Witness

Giriş
1. nesne.<TypeWitness>myMethod() şeklindedir
2. Sınıf::<TypeWitness>myMethod() şeklindedir

Derleyiciye yardımcı olmak için kullanılır.

Örnek
Elimizde şöyle bir generic kod olsun.
public <T extends Object> List<T> getColData(final String col)
Bu kod Object Listesi döndüğü için şu kod derlenmez.
List <String> c = Stream.concat(getColDataStream(col1).stream(),
                                getColDataStream(col2).stream())
                         .collect(Collectors.toList());
Şöyle yaparız.
Stream.concat(table.<String>getColData(col1).stream(),
              table.<String>getColData(col2).stream()) 
       .collect(Collectors.toList());
Örnek
Elimizde şöyle bir kod olsun.
public class Foo {
  interface Bar {
  }

  void doesNotCompile() {
    Optional.of(new Bar() {}) //Foo$1
           .orElse(new Bar() {}); //Foo$2
  }

  void doesNotCompile2() {
    final Bar bar = new Bar() {}; 
    Optional.of(new Bar() {}) //Foo$1
            .orElse(bar); //Bar does not derive from Foo$1
    }

  void compiles1() {
    final Bar bar = new Bar() {};
    Optional.of(bar).orElse(new Bar() {}); //Foo$1 has super type Bar
  }
}
Açıklaması şöyle.
Here, Optional has the generic type Foo$1 and you are trying to pass an object of type Foo$2 into orElse which does not have Foo$1 as a super type. Hence the compile error.
Şöyle yaparız.
Optional.<Bar>of(new Bar(){}).orElse(new Bar(){});

Hiç yorum yok:

Yorum Gönder