最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

KTV和泛型(2)

標(biāo)簽:
Java

很多使用泛型的小伙伴都会有一个疑惑:为什么有的方法返回值前带<T>、<K, V>之类的标记,而有的方法返回值前又什么都不带呢?就像这样

// 实体基类
class Entity {
   public String toString() {
      return "Entity";
   }
}
// 用户类
class User extends Entity {
   public String toString() {
      return "User";
   }
}
// 用户Dao
class UserDao {
   public String toString() {
      return "UserDao";
   }
}
 
/**
 * 带<E>标记与不带<E>标记的比较
 */
public class GenericsClass<T extends Entity> {
   // 不带标记
   public void notSign(T t) {
      System.out.println("notSign  " + t.toString());
   }

   // 带<T>标记
   public <T> void hasSign(T e) {
      System.out.println("hasSign  " + e.toString());
   }

   public static void main(String[] args) {
      GenericsClass<Entity> clazz = new GenericsClass<>();
      Entity entity = new Entity();
      User user = new User();
      UserDao userDao = new UserDao();

      System.out.println("不带标记的方法:");
      clazz.notSign(entity);
      clazz.notSign(user);
      // 不能编译通过的
      // 因为在GenericsClass<T extends Entity>中已经限定了全局的T为Entity及其子类,
      // 所以不能再加入UserDao;
      // clazz.notSign(userDao);

      System.out.println("带标记的方法:");
      clazz.hasSign(entity);
      clazz.hasSign(user);
      // 带上前缀<E>,就是在告诉编译器:这是新指定的一个类型,代表该方法自己独有的某个类,
      // 跟GenericsClass<T extends Entity>中的Entity及其子类没有任何关系
      // 或者说
      // hasSign方法重新定义泛型T、隐藏或者代替了GenericsClass<T>中的T,不再受限于Entity及其子类
      clazz.hasSign(userDao);
   }
}

 

因此,返回值前面的<T>的作用是「重新定义泛型」,因此方法参数类型不受对象泛型类型的限制。Java新的Stream API中有大量这种带前缀的用法,例如

ArrayList.java:public <T> T[] toArray(T[] a)
Optional.java:public static <T> Optional<T> of(T value)
Collectors.java:public static <T> Collector<T, ?, List<T>> toList()

 

泛型作为Java的一个基础特性并不是一点毛病都没有,「泛型擦除就是至今还未解决的一个问题这个问题其实对于大多数人来说可以不用知道因为实际应用中极少出现这种场景感兴趣的话稍稍了解一下不喜可绕过)。

所谓泛型擦除是这样一个问题

class User {}
class Product {}
class Shop<V> {}
class Particle<PPP, QQQ> {}

public class LostInformation<T> {
   public static void main(String[] args) {
      // ArrayList<String>和ArrayList<Integer>应该是不同的类型,但结果是它们完全相等
      Class<?> c1 = new ArrayList<String>().getClass();
      Class<?> c2 = new ArrayList<Integer>().getClass();
      System.out.println(c1 == c2);

      // 无法从泛型获得任何有关参数类型的信息
      List<User> list = new ArrayList<>();
      Map<User, Product> map = new HashMap<>();
      Shop<User> shop = new Shop<>();
      Particle<Long, Double> p = new Particle<>();
      System.out.println(Arrays.toString(list.getClass().getTypeParameters()));
      System.out.println(Arrays.toString(map.getClass().getTypeParameters()));
      System.out.println(Arrays.toString(shop.getClass().getTypeParameters()));
      System.out.println(Arrays.toString(p.getClass().getTypeParameters()));
   }
}


可以看见Particle<Long, Double>中关于LongDouble的信息已经完全丢失了只剩下了最初的PPP和QQQ真的应了那句话历经千帆归来仍是是少年

但这是编程啊不是文案啊~,不能这样丢掉了



點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消