Правильное использование для избежания ненужных приведений с универсальными типами (преобразование SuppressWarnings без проверки) - PullRequest
1 голос
/ 08 июля 2011

Есть похожие вопросы, но я не нашел ни одного, который действительно отвечал бы моим проблемам или охватывал бы мою реальную реализацию.

со следующим примером кода (который отражает мою реальную ситуацию)

public class MainTest {

    public static void main(String[] args) {
        WhateverDtoXmlParser parser = (new MainTest()).new WhateverDtoXmlParser();

        // I want to do this (having to do suppressWarnings)
        WhateverDto wd = parser.getDto();

        // Instead of (usage without the warning).
        // I want to avoid all of this!
        Dto d = parser.getDto();
        WhateverDto wd2 = null;
        if (d instanceof WhateverDto) { // All of this is stupid and unnecessary IMO.
            wd2 = (WhateverDto) d;
        }
    }

    abstract class AbstractDtoXmlParser {
        public abstract <T extends Dto> T getDto();
    }

    class WhateverDtoXmlParser extends AbstractDtoXmlParser {

        @SuppressWarnings("unchecked")
        @Override
        public WhateverDto getDto() { // instead of public Dto getDto() (to avoid instanceof + cast)
            return new WhateverDto();
        }
    }

    abstract class Dto {
        // ...
    }

    public class WhateverDto extends Dto {
        // ...
    }
}

Считаете ли вы это правильным использованием, хотя я использовал подавление предупреждений? Я имею в виду, что я ЗНАЮ возвращаемый тип из WhateverDtoXmlParser будет WhateverDto, а не просто любым другим Dto, потому что я кодировал его таким образом . Почему Java не может проверить, если возвращаемый тип extends Dto , как я явно указал его с помощью <T extends Dto> (плюс он расширяет абстрактный класс ...), и принять его?

Либо я делаю это там, либо я должен использовать instanceof s и приводить каждый раз, когда использую getDto() ..! Мне кажется, что моя текущая реализация «лучшая», но тогда почему я получаю такое важное предупреждение?

После прочтения других тем кажется, что нет способа обойти это предупреждение, но стоит ли мне продолжать мою текущую реализацию?

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Попробуйте это:

abstract class AbstractDtoXmlParser<T extends Dto> {
    public abstract T getDto();
}

class WhateverDtoXmlParser extends AbstractDtoXmlParser<WhateverDto> {

    @Override
    public WhateverDto getDto() {
        return new WhateverDto();
    }
}
2 голосов
/ 08 июля 2011

Если вы точно знаете, что тип, который вы получаете, это тип, который вы ожидаете, нет ничего плохого в том, чтобы делать небезопасное приведение типа этого ...

WhateverDto d = (WhateverDto) parser.getDto();

Это все еще не самое чистое, но оно не должно давать вам предупреждения, и для написания также не потребуется 4 строки.

...