Можно ли обеспечить соблюдение ковариантных типов возврата в общих интерфейсах Java без необработанных типов или класса JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Можно ли обеспечить соблюдение ковариантных типов возврата в общих интерфейсах Java без необработанных типов или класса

Сообщение Anonymous »

Я пытаюсь разработать набор общих интерфейсов и реализаций, где я хочу обеспечить соблюдение ковариатных типов возврата для методов, которые производят объекты общего типа. Другими словами, если у меня есть интерфейс, как это: < /p>
interface Producer {
T produce();
}
< /code>
и подвладежение: < /p>
interface SpecificProducer extends Producer {
@Override
// I want to ensure this returns SpecificType, not just T
T produce();
}
< /code>
и конкретный класс: < /p>
class SpecificType {
// some properties and methods
}
< /code>
class MoreSpecificType extends SpecificType {
//inherits the props of SpecificType
}
< /code>
class ConcreteProducer implements SpecificProducer {
@Override
public SpecificType produce() {
return new SpecificType(); // I want to enforce this return type
}
}
< /code>
My goal is to ensure that the produce() Метод в конкретном продукторе и его реализациях должен Sefilettype (или его подтип, например, Morepecifictype ), и не более общий тип, который удовлетворяет связанным t . Стандартный механизм @Override помогает в обнаружении несоответствий подписи метода, но он только подтверждает, что тип возврата является допустимым переопределением в соответствии со стандартными правилами ковариации (т.е. SefficType является подтипом t ). Это не гарантирует «наиболее специфический» тип.
есть ли способ, используя джентовую java, для обеспечения соблюдения во времени компиляции, что метод продукта () в конкретном продуцированном (и аналогичных интерфейсах) должен вернуть наиболее специфический тип (или его подтега T ?
код, который должен не compile:
class IncorrectProducer implements SpecificProducer {
@Override
public SpecificType produce() {
return new MoreSpecificType(); // This is OK because MoreSpecificType is a subtype of SpecificType
}
}

class WrongProducer implements SpecificProducer {
@Override
public SpecificType produce() {
return new SpecificType(); // also ok, just like intended
}
}

class BadProducer implements SpecificProducer {
@Override
public SpecificType produce() {
return new SpecificType(); // ALSO still OK!
}
}

interface SuperProducer extends SpecificProducer{} // nothing should change with superinterfaces

class WorstProducer implements SuperProducer {
@Override
public SpecificType produce() {
return new SpecificType(); // Sadly, this is also OK - but I don't want this, I ONLY want SpecificType, not subtype!
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... faces-with
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»