私の質問は、Generics をレガシー Java クラスに導入することに関するものです。以下のコードから生成したい従来のクラスは、ClientObjectProxy と ClientObjectContainer です。ClientObject は変更されません。簡単にするために、すべてのクラスを 1 つの外部クラスに入れました。
現在、レガシー コードには、パラメータ化されていない ClientObjectProxyContainer インスタンスの ClientObjectProxyContainer.getProxies() メソッドの呼び出しが多数あります。
ループ 4 のような Generics の既存のコードを導入することで、これ以上コンパイルできなくなります。ループ 1 のように呼び出しをローカル変数に抽出するか、ループ 2 のように疑問符付きの宣言を使用する必要があります。新しいコードはパラメーター化されたものを使用する必要があります。ループ 3 のような変数。
私の質問は、既存のコードをループ 1 またはループ 2 に変更する方法ですか、それともレガシー コードを変更しない方法はありますか?
ありがとう
1月
import java.util.ArrayList;
import java.util.List;
public class GenericForumsExample {
/**
* This class is unchanged
*/
private class ClientObject {
}
/**
* @param <T> Type of the ClientObject behind this proxy
*/
private class ClientObjectProxy<T extends ClientObject> {
}
/**
* @param <T> Type of the ClientObject contained in this collection
*/
private class ClientObjectProxyContainer<T extends ClientObject> {
//Previous signature was:
// public List<ClientObjectProxy> getProxies(){
// New signature is the following
public List<ClientObjectProxy<T>> getProxies(){
return new ArrayList<ClientObjectProxy<T>>();
}
}
public void testScenario() {
ClientObjectProxyContainer proxyContainer = new ClientObjectProxyContainer();
List<ClientObjectProxy> proxies = proxyContainer.getProxies(); // Just a compiler warning
// Loop 1
for (ClientObjectProxy proxy : proxies) { // Compiler OK
//Do something...
}
// Loop 2
ClientObjectProxyContainer<?> clientObjectProxyContainer = new ClientObjectProxyContainer();
for (ClientObjectProxy<?> proxy : clientObjectProxyContainer.getProxies()) {
//Do something...
}
// Loop 3
for (ClientObjectProxy<ClientObject> proxy : new ClientObjectProxyContainer<ClientObject>().getProxies()) {
//Do something...
}
// Loop 4
// Compiler fails on next code line
// incompatible types
// found : java.lang.Object
// required: GenericForumsExample.ClientObjectProxy
for (ClientObjectProxy proxy : proxyContainer.getProxies()) {
//Do something...
}
}
}