2014-01-06 3 views
1

Это, наверное, немой вопрос, но мне нужно знать. У меня есть интерфейс, какПовышение и понижение Java по интерфейсам

import com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsync; 

public interface AsyncClient extends AmazonDynamoDBAsync{ 

} 

И у меня есть ClientCreator класс, который имеет метод

import com.company.clients.AsyncClient; 
public class ClientCreator { 
     public static AsyncClient getAsyncClient() throws FileNotFoundException, IllegalArgumentException, IOException{ 
      AmazonDynamoDBAsync client = new AmazonDynamoDBAsyncClient(getCredentials()); 
      client.setRegion(getRegion()); 
      return (AsyncClient)client; 
     } 
     . 
     . 
     . 

Здесь AmazonDynamoDBAsyncClient реализует AmazonDynamoDBAsync и AsyncClient расширяет AmazonDynamoDBAsync, но этот код не будет работы и выбросы

com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient не может быть приведение к com.company.clients.AsyncClient

но почему?

+1

Выполняет ли 'AmazonDynamoDBAsyncClient'' AsyncClient'? – cHao

+0

Нет, это не так, и это невозможно. Но он реализует AmazonDynamoDBAsync, а AsyncClient расширяет его. – ufucuk

+0

Итак, если «Пудель» реализует «Животное», а «Кошка» расширяет «Животное», вы в основном спрашиваете: «Как я отношусь к« Пуле »как к« Кошке »? – cHao

ответ

11

В основном у вас есть иерархия, как это:

  AmazonDynamoDBAsync 
       ^
        | 
    ----------------------------- 
    |       | 
AmazonDynamoDBAsyncClient AsyncClient 

И вы пытаетесь бросить AmazonDynamoDBAsyncClient экземпляр AsyncClient, что не возможно. Это братья и сестры. Возьмите это так: «Яблоко» и «Банан» - это «Фрукты», но «Яблоко» - это не «Банан».

+1

Отличная работа по форматированию :) – csmckelvey

+0

Просто логично каким-то образом я чувствую, что я должен быть способный отличать, поскольку Class1 и Interface2 фактически используют методы. И casted object получит только те методы, которые доступны в интерфейсе1. Но, конечно, я мог быть совершенно не прав. – ufucuk

+0

@ufucuk: Вы не можете бросить то, что не находится в линии линии, как указывает Рохит. Это просто фундаментально. Неважно, насколько они похожи, по определению они разные. Предполагая 'интерфейс Base', и у нас есть' интерфейс A extends Base' и 'interface B extends Base' (ни один из них ничего не добавляет к' Base'). вы не можете использовать 'A' для' B' (или наоборот). 'A' не находится в линии B и не наоборот. –

Смежные вопросы