簡體   English   中英

運行時通用類型Java

[英]Runtime Generic Type Java

假設我有:

ClassA extends SuperClass{ ...}
ClassB extends SuperClass{ ... }

同樣ClassX<T extends SuperClass> { ... }

現在,在運行時,我遇到了一個對象,該對象應該是ClassA或ClassB之一。 我想基於此創建ClassX的實例。 我怎樣才能做到這一點?

我努力了:

Class<?> className = object.getClass();
Class<className> objectx = ...

這不起作用。

提前致謝!

ClassX<SuperClass> myObj = new ClassX<SuperClass>();

您只是說一個泛型類,您可以在該類中擁有一個值,即該泛型類型

ClassX<T extends SuperClass>{
    public T value; // its just public so i dont need a setter
}

現在可以執行以下操作:theObjectThatIsAOrB = xy.get()//現在得到的對象是ClassA或ClassB

ClassX<SuperClass> myObj = new ClassX<SuperClass>();
myOjb.value = theObjectThatIsAOrB;

這是不可能的,因為這沒有意義。 想一想,如果您能做到這一點,它將有什么好處? 類型參數的唯一目的是在編譯時進行類型檢查。 因此,如果您有一個在編譯時不知道的類型參數,它就不能進行類型檢查,並且它什么也做不了。 因此,將type參數放在第一位是沒有意義的。 (使用通配符沒有什么不同。)

如果編譯器可以確定涉及到A或B,則只需使用new。

public <T extends SuperClass> ClassX <T> makeClassXInstance( T aOrB ) {
    return new ClassX<T>();
}

另一方面,如果您要在運行時確定類,則可能會發生這種情況。 但是您遇到了變量類型問題。 Java很爛地解決了它。

public <T extends SuperClass> ClassX <T> makeClassXInstance( T aOrB ) {
    return new ClassX<T>( aOrB.getClass() );
}

public class ClassX<T>{
    public ClassX( Class<T> cls ) {...}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM