Целочисленная ссылка на тип Значение типа String - PullRequest
3 голосов
/ 24 июня 2010

два класса:

public class BaseDo<K> {
    protected K id;

    public K getId() {
        return id;
    }

    public void setId(K id) {
        this.id = id;
    }
}


public class BeanDo extends BaseDo<Integer> {
    private String beanName;

    public String getBeanName() {
        return beanName;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }
}

Я хочу использовать отражение для имплементации следующим образом:

BeanDo beanDo = new BeanDo();
beanDo.setId("string here");

Ссылка на целочисленный тип Значение типа строки.

Ответы [ 5 ]

1 голос
/ 02 июля 2010

Обобщения в Java не используются во время выполнения, поэтому в среде выполнения Java ваше поле идентификатора имеет тип Object и поэтому может быть установлено на любое значение независимо от обобщений. Тем не менее, это плохая идея, так как все, что предполагает общий договор, потерпит неудачу.

Вы можете установить поле с помощью отражения следующим образом:

BeanDo beanDo = new BeanDo();
Method method = BeanDo.getClass().getMethod("setId", Object.class);
method.invoke(beanDo, "SomeRandomString");

Тем не менее, делать это крайне плохая идея, потому что любой код, скомпилированный с BeanDo, будет считать, что id - это целое число, а не строка. Таким образом, любой код, такой как beanDo.getId(), потерпит неудачу с исключением приведения класса, потому что на самом деле это не целое число.

Как и другие постеры, я немного не в курсе того, чего вы пытаетесь достичь.

0 голосов
/ 02 июля 2010

Это похоже на подкласс о единственном способе установить строку, но при этом гарантировать, что любой, кто уже вызывает getId (), получит ожидаемое целое число. Примерно так:

public class StringBeanDo extends BeanDo {
  private String stringId;

  public String getStringId()
  {
    return stringId;
  }

  public void setId( Integer val )
  {
    super.setId( val );
    stringId = Integer.toString( val );
  }

  public void setId( String str )
  {
    stringId = str;
    super.setId( convertStringToInteger( str )); // Do this however you like.
  }
}

Реализация convertStringToInteger будет зависеть от вас (это будет зависеть от того, для чего используется этот идентификатор). Ключевым моментом здесь является то, что вы поддерживаете ДВА идентификатора и синхронизируете их, так что старый код все еще может в некоторой степени зависать.

0 голосов
/ 24 июня 2010

Что по этому поводу:

BeanDo beando = new BeanDo();
beando.setId("string there".hashCode());

Я не совсем понимаю, что вы имеете в виду под "Я хочу использовать отражение для реализации этого" хотя.

Полагаю, вы хотите что-то вроде этого:

    BeanDo doer = ... // get it from somewhere
    String id   = ... // get it from somewhere else too. 

    // and you want to set id to the doer bean.
    reflectionMagicSetId( doer, id ); 

И есть такой метод:

 private void reflectionMagicSetId( BandDo doer, String id ) {
       /// do some magic here? 
 }

Если это то, что вы хотите, то, что я вам даю, работает отлично.

 private void reflectionMagicSetId( BandDo doer, String id ) {
     doer.setId( id == null ? 0 : id.hashCode()  );
 }
0 голосов
/ 01 июля 2010

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

0 голосов
/ 24 июня 2010

Примерно так?

public class BaseDo<K> {

  protected K id;

  public K getId() {
    return id;
  }

  public void setId(K id) {
    this.id = id;
  }

}

public class BeanDo extends BaseDo<Integer> { 

  private String beanName;

  public void setId(String id) {
    setId(Integer.parseInt(id));
  }

  public String getBeanName() {
    return beanName;
  }

  public void setBeanName(String beanName) {
    this.beanName = beanName;
  }

}

Теперь вы можете использовать что-то вроде этого:

BeanDo beanDo = new BeanDo();
beanDo.setId("2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...