1
編譯此示例代碼(在failed()方法中)時出現意外錯誤。的IntelliJ使用不報告在IDE中的錯誤,但它已經開始彙報(一些類是在一個庫中,這似乎混淆)Java通用類型在沒有中間變量的情況下失敗
public class Main {
// The command
public interface ToMessageOperation<MODEL, MESSAGE> {
void run(MODEL object, MESSAGE message) throws Exception;
}
// A command
public class SelfLink<MODEL> implements ToMessageOperation<MODEL, LinkedMessage> {
@Override
public void run(MODEL object, LinkedMessage linkedMessage) throws Exception {
}
}
// A message type
public interface LinkedMessage {
void linkme();
}
// A message
public interface BootInfo extends LinkedMessage {
}
//The Executor
public interface GetRequest<MODEL, MESSAGE> {
GetRequest<MODEL, MESSAGE> runAll(ToMessageOperation<? super MODEL, ? super MESSAGE>... operations);
GetRequest<MODEL, MESSAGE> cleanUp();
MESSAGE now();
}
// The command factory
public SelfLink selfLink() {
return null;
}
public <MODEL, MESSAGE> GetRequest<MODEL,MESSAGE> get(Class<MESSAGE> message) {
return null;
}
public BootInfo works() {
return get(BootInfo.class).cleanUp().now();
}
public BootInfo alsoWorks() {
return get(BootInfo.class).runAll(new ToMessageOperation<Object, BootInfo>() {
@Override
public void run(Object object, BootInfo bootInfo) throws Exception {
}
}).now();
}
public BootInfo surprisedItWorks() {
return get(BootInfo.class).runAll(new ToMessageOperation<Object, LinkedMessage>() {
@Override
public void run(Object object, LinkedMessage message) throws Exception {
}
}).now();
}
public BootInfo fails() {
return get(BootInfo.class).runAll(new SelfLink()).now();
}
}
我有點意外的是,錯誤只發生在我添加runAll()方法時,因爲所有方法都返回相同的對象。
我真的很驚訝,該方法適用於從失敗的情況下分配的不同類型(其中ToMessageOperation類型被繼承而不是顯式)。即使這樣也不應該改變返回類型,對吧?
我做錯了什麼?
我想你沒有太多選擇。你可以這樣做:return get(BootInfo.class).runAll(selfLink())。 now();或使用@SuppressWarnings。看到這裏:http://stackoverflow.com/questions/450807/how-do-i-make-the-method-return-type-generic –
mttdbrd
你的代碼似乎不完整。 'BootResource.get()'應該是靜態的嗎?一個實際的可構建的,可運行的例子將有所幫助。 – markspace
@markspace'BootResource.get()'不應該是靜態的(它在這個例子中)。我同意,整個可編輯的例子可以幫助(我只是試圖減少噪音)。我今天晚些時候會解決這個問題。 –