亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲得T型泛型的類實例

如何獲得T型泛型的類實例

慕無忌1623718 2019-06-06 11:09:36
如何獲得T型泛型的類實例我有個仿制類,Foo<T>..用一種方法Foo,我想獲得類型T的類實例,但我不能調用T.class.使用T.class?
查看完整描述

3 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

簡單地說,在Java中找不到泛型參數的運行時類型。我建議閱讀關于類型擦除的一章。Java教程更多細節。

這方面的一個流行解決方案是傳遞Class將類型參數轉換為泛型類型的構造函數,例如

class Foo<T> {
    final Class<T> typeParameterClass;

    public Foo(Class<T> typeParameterClass) {
        this.typeParameterClass = typeParameterClass;
    }

    public void bar() {
        // you can access the typeParameterClass here and do whatever you like
    }}


查看完整回答
反對 回復 2019-06-06
?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

然而,有一個小漏洞:如果您定義Foo類作為抽象類。這意味著必須將類實例化為:

Foo<MyType> myFoo = new Foo<MyType>(){};

(請注意末尾的雙大括號。)

現在您可以檢索T在運行時:

Type mySuperclass = myFoo.getClass().getGenericSuperclass();Type tType = ((ParameterizedType)mySuperclass).getActualTypeArguments()[0];

不過,請注意mySuperclass必須是類定義的超類,實際上定義了T.

它也不是很優雅,但是你必須決定你是否更喜歡。new Foo<MyType>(){}new Foo<MyType>(MyType.class);在你的密碼里。


例如:

import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.ArrayDeque;import java.util.Deque;
import java.util.NoSuchElementException;/**
 * Captures and silently ignores stack exceptions upon popping.
 */public abstract class SilentStack<E> extends ArrayDeque<E> {
  public E pop() {
    try {
      return super.pop();
    }
    catch( NoSuchElementException nsee ) {
      return create();
    }
  }

  public E create() {
    try {
      Type sooper = getClass().getGenericSuperclass();
      Type t = ((ParameterizedType)sooper).getActualTypeArguments()[ 0 ];

      return (E)(Class.forName( t.toString() ).newInstance());
    }
    catch( Exception e ) {
      return null;
    }
  }}

然后:

public class Main {
    // Note the braces...
    private Deque<String> stack = new SilentStack<String>(){};

    public static void main( String args[] ) {
      // Returns a new instance of String.
      String s = stack.pop();
      System.out.printf( "s = '%s'\n", s );
    }}


查看完整回答
反對 回復 2019-06-06
  • 3 回答
  • 0 關注
  • 1087 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號