この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Type クラス

Apex クラスに対応する Apex のデータ型を取得し、新しい型をインスタンス化するためのメソッドを含みます。

名前空間

System

使用方法

forName メソッドを使用して、Apex クラス (組み込みクラスまたはユーザ定義クラス) のデータ型を取得します。また、newInstance メソッドは、インターフェースを実装する型をインスタンス化し、そのメソッドをコールすると同時に、パッケージの登録者など他のユーザがメソッドの実装を提供できるようにする場合に使用します。

例: 名前に基づいた Type のインスタンス化

次のサンプルは、Type メソッドを使用して、Type をその名前に基づいてインスタンス化する方法を示します。このシナリオの典型的な応用として、パッケージの登録者が、インストールされたパッケージの一部としてインターフェースのカスタム実装を提供する場合があります。パッケージは、登録者の組織のカスタム設定を介してインターフェースを実装するクラスの名前を取得できます。パッケージは、このクラス名に対応する型をインスタンス化して、登録者が実装したメソッドを呼び出すことができます。

このサンプルでは、VehicleVehicleImpl クラスによって実装されるインターフェースを表します。最後のクラスには、VehicleImpl に実装されたメソッドを呼び出すコードサンプルが含まれます。

これが Vehicle インターフェースです。
1global interface Vehicle {
2    Long getMaxSpeed();
3    String getType();
4}
これが Vehicle インターフェースの実装です。
1global class VehicleImpl implements Vehicle {
2    global Long getMaxSpeed() { return 100; }    
3    global String getType() { return 'Sedan'; }
4}
このクラスのメソッドは、Vehicle インターフェースを実装するクラスの名前をカスタム設定値を介して取得します。その後、このクラスをインスタンス化するために、対応する型を取得し、newInstance メソッドをコールします。次に、VehicleImpl に実装されたメソッドを呼び出します。このサンプルでは、className という名前のテキスト項目を持つ CustomImplementation という名前の公開リストカスタム設定を作成する必要があります。このカスタム設定のレコードを、Vehicle というデータセット名とクラス名値 VehicleImpl で 1 つ作成します。
1public class CustomerImplInvocationClass {
2
3    public static void invokeCustomImpl() {
4        // Get the class name from a custom setting.
5        // This class implements the Vehicle interface.
6        CustomImplementation__c cs = CustomImplementation__c.getInstance('Vehicle');
7        
8        // Get the Type corresponding to the class name
9        Type t = Type.forName(cs.className__c);
10        
11        // Instantiate the type.
12        // The type of the instantiated object 
13        //   is the interface.
14        Vehicle v = (Vehicle)t.newInstance();
15        
16        // Call the methods that have a custom implementation
17        System.debug('Max speed: ' + v.getMaxSpeed());
18        System.debug('Vehicle type: ' + v.getType());       
19    }
20}

クラスのプロパティ

class プロパティは、コールされたデータ型の System.Type を返します。これは、プリミティブデータ型とコレクション、sObject 型、ユーザ定義クラスを含むすべての Apex 組み込みデータ型で公開されます。forName メソッドの代わりにこのプロパティを使用できます。

データ型名に対してこのプロパティをコールします。たとえば、次のようになります。
1System.Type t = Integer.class;

JSON.deserializedeserializeStrictJSONParser.readValueAsreadValueAsStrict メソッドの 2 番目の引数にこのプロパティを使用して、並列化するオブジェクトのデータ型を取得できます。たとえば、次のようになります。

1Decimal n = (Decimal)JSON.deserialize('100.1', Decimal.class);

型メソッド

Type のメソッドは次のとおりです。

equals(typeToCompare)

指定されたデータ型が現在のデータ型と同じ場合は true を返し、そうでない場合は false を返します。

署名

public Boolean equals(Object typeToCompare)

パラメータ

typeToCompare
型: Object
現在のデータ型と比較するデータ型です。

戻り値

型: Boolean

1Type t1 = Account.class;
2Type t2 = Type.forName('Account');
3System.assert(t1.equals(t2));

forName(fullyQualifiedName)

指定された完全修飾クラス名に対応するデータ型を返します。

署名

public static System.Type forName(String fullyQualifiedName)

パラメータ

fullyQualifiedName
型: String
データ型を取得するクラスの完全修飾名です。完全修飾クラス名には、MyNamespace.ClassName などの名前空間名が含まれます。

戻り値

型: System.Type

使用方法

  • このメソッドでは、管理パッケージの非グローバルクラスの型を取得するために、管理パッケージ外からコールされた場合は null を返します。これは、非グローバルクラスは管理パッケージ外では参照できないためです。Salesforce API バージョン 27.0 以前を使用して保存された Apex の場合、このメソッドは非グローバルの管理パッケージクラスの対応するクラス種別を返します。
  • 名前空間が定義されていない組織のローカル型の名前を取得するためにインストールされた管理パッケージから forName(fullyQualifiedName) メソッドをコールすると、null が返されます。forName(namespace, name) メソッドを代わりに使用し、namespace 引数に空の文字列または null を指定します。

メモ

forName(namespace, name)

指定された名前空間およびクラス名に対応するデータ型を返します。

署名

public static System.Type forName(String namespace, String name)

パラメータ

namespace
型: String
クラスの名前空間。クラスに名前空間がない場合、namespace 引数を null または空の文字列に設定します。
name
型: String
クラスの名前です。

戻り値

型: System.Type

使用方法

  • このメソッドでは、管理パッケージの非グローバルクラスの型を取得するために、管理パッケージ外からコールされた場合は null を返します。これは、非グローバルクラスは管理パッケージ外では参照できないためです。Salesforce API バージョン 27.0 以前を使用して保存された Apex の場合、このメソッドは非グローバルの管理パッケージクラスの対応するクラス種別を返します。
  • 名前空間が定義されていない組織にインストールされた管理パッケージからコールする場合には、forName(fullyQualifiedName) の代わりにこのメソッドを使用します。ローカル型の名前を取得するには、namespace 引数を空の文字列または null に設定します。たとえば、Type t = Type.forName('', 'ClassName'); です。

メモ

この例では、ClassName クラスおよび MyNamespace 名前空間に対応するデータ型を取得する方法を示します。

1Type myType = 
2   Type.forName('MyNamespace', 'ClassName');

getName()

現在の型の名前を返します。

署名

public String getName()

戻り値

型: String

この例では、Type の名前を取得する方法を示します。最初に forName をコールして Type を取得し、次にその Type オブジェクトに対して getName をコールします。

1Type t = 
2   Type.forName('MyClassName');
3
4String typeName = 
5   t.getName();
6System.assertEquals('MyClassName',
7   typeName);

hashCode()

現在のデータ型のハッシュコード値を返します。

署名

public Integer hashCode()

戻り値

型: Integer

使用方法

返されたハッシュコード値は、String.hashCode が返す型名のハッシュコードに対応します。

newInstance()

現在の型のインスタンスを作成し、この新しいインスタンスを返します。

署名

public Object newInstance()

戻り値

型: Object

使用方法

newInstance は汎用オブジェクト型を返すため、この値を保持する変数の型に戻り値を変換する必要があります。

このメソッドを使用すると、インターフェースを実装する Type をインスタンス化し、そのメソッドをコールできると同時に、他のユーザがメソッドの実装を提供できるようになります。たとえば、パッケージ開発者がインターフェースを提供し、登録者がそのインターフェースを実装してパッケージをインストールできます。パッケージのコードは、登録者の Type をインスタンス化することで、登録者のインターフェースメソッドの実装をコールします。

非公開の非引数コンストラクタを含むクラスに対応する型でこのメソッドをコールすると、この型はインスタンス化することができないため、予測どおり System.TypeException が発生します。Salesforce API バージョン 28.0 以前を使用して保存された Apex の場合、このメソッドは代わりにクラスのインスタンスを返します。

メモ

次の例では、Type のインスタンスを作成する方法を示します。最初に forName をクラスの名前 (ShapeImpl) でコールして Type を取得し、次にこの Type オブジェクトに対して newInstance をコールします。newObj インスタンスは、ShapeImpl クラスが実装するインターフェース型 (Shape) を使用して宣言されます。newInstance メソッドの戻り値は、Shape 型に変換されます。

1Type t = 
2   Type.forName('ShapeImpl');
3
4Shape newObj = 
5   (Shape)t.newInstance();

toString()

現在のデータ型 (データ型名) を文字列表現で返します。

署名

public String toString()

戻り値

型: String

使用方法

このメソッドは、getName と同じ値を返します。String.valueOf および System.debug はこのメソッドを使用して、Type 引数を string に変換します。

この例では、Integer のリストに対応する Type に対して toString をコールします。

1Type t = List<Integer>.class;
2String s = t.toString();
3System.assertEquals('List<Integer>', s);